概述
本章主要配置printf进行打印。 查阅手册可以得知,PA9、PA10为串口0的输出和输入口。需要GD样片的可以加群申请:615061293。
样品申请
https://www.wjx.top/vm/wFGhGPF.aspx#
硬件准备
这里准备了1块开发板进行验证,分别是GD32303C_START开发板。
keil配置
microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。
串口初始化
对串口进行配置。 使用串口时候,需要对GPIO进行复用这里把串口的 Tx 引脚配置为复用推挽输出,Rx 引脚为浮空输入。 设置USART0 通信参数为:波特率 115200,字长为 8,1 个停止位,没有校验位,收发一体工作模式,然后调用 USART 初始化函数完成配置。
/* 使能GPI0A,用PA9、PA10为串口 */
rcu_periph_clock_enable(RCU_GPIOA);
/*使能串口0的时钟 */
rcu_periph_clock_enable(RCU_USART0);
/*配置USARTx_Tx(PA9)为复用推挽输出*/
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
/*配置USARTx_RxPA9)为浮空输入 */
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
/* USART 配置 */
usart_deinit(USART0);//重置串口0
usart_baudrate_set(USART0, 115200U);//设置串口0的波特率为115200
usart_word_length_set(USART0, USART_WL_8BIT); // 帧数据字长
usart_stop_bit_set(USART0, USART_STB_1BIT); // 停止位1位
usart_parity_config(USART0, USART_PM_NONE); // 无奇偶校验位
usart_receive_config(USART0, USART_RECEIVE_ENABLE);//使能接收器
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);//使能发送器
usart_enable(USART0);//使能USART
串口重定向
/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
usart_data_transmit(USART0, (uint8_t)ch);
while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
return ch;
}
串口重定向后就可以使用printf进行打印。
usart_data_transmit()发送
usart_data_transmit()是USART发送数据函数。 定义发送函数。
void uart_data_transmit(uint8_t arr[], uint32_t length)
{
uint32_t i;
for(i=0; iusart_data_transmit(USART0, arr[i]);
while (usart_flag_get(USART0, USART_FLAG_TBE)== RESET);
}
}
在主程序中添加代码,打印HELLO!
while (1)
{
uint8_t str[] = "HELLO!\\r\\n";
uint32_t len = sizeof(str) / sizeof(*str);
uart_data_transmit(str,len-1);
delay_1ms(1000);
}
测试结果
中断发送
若要使用串口的中断函数USART0_IRQHandler(),需要先开启串口中断。
对于中断发送,需要usart_interrupt_enable()开启发送缓冲区空中断。 抢占优先级,数字越小,优先级越高。 若抢占优先级相同,判断子优先级,同样,数字越小,优先级越高。
/*开启USART0中断 */
nvic_irq_enable(USART0_IRQn, 0, 0);
/* 使能串口发送中断 */
usart_interrupt_enable(USART0, USART_INT_TBE);
delay_1ms(1000); //开启后会进入中断进行发送,故需要进行一个延迟
定义发送变量。
#define ARRAYNUM(arr_nanme) (uint32_t)(sizeof(arr_nanme) / sizeof(*(arr_nanme)))
#define TRANSMIT_SIZE (ARRAYNUM(txbuffer) - 1)
uint8_t txbuffer[] = "\\n\\rUSART interrupt test\\n\\r";//发送的数据
uint8_t tx_size = TRANSMIT_SIZE;//需要发送数据长度
__IO uint8_t txcount = 0; //发送数据长度
串口中断定义。
void USART0_IRQHandler(void)
{
if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE))//发送
{
/* transmit data */
usart_data_transmit(USART0, txbuffer[txcount++]);//发送一个八位数据
if(txcount == tx_size)//发送完毕
{
usart_interrupt_disable(USART0, USART_INT_TBE);//关闭发送中断
}
}
}
测试结果
中断接收
若要使用串口的中断函数USART0_IRQHandler(),需要先开启串口中断。
对于中断接收,需要usart_interrupt_enable()开启接收中断。 抢占优先级,数字越小,优先级越高。 若抢占优先级相同,判断子优先级,同样,数字越小,优先级越高。
/*开启USART0中断 */
nvic_irq_enable(USART0_IRQn, 0, 0);
/* 使能串口发送中断 */
usart_interrupt_enable(USART0, USART_INT_TBE);
delay_1ms(1000); //开启后会进入中断进行发送,故需要进行一个延迟
while(RESET == usart_flag_get(USART0, USART_FLAG_TC));//USART_FLAG_TC发送完成中断
/* 使能串口接收中断*/
usart_interrupt_enable(USART0, USART_INT_RBNE);
/* 等待接收完毕 */
while(rxcount < rx_size);
if(rxcount == rx_size)
printf("\\n\\r接收完毕,接收数据是:");
uart_data_transmit(rxbuffer,rx_size);//发送接收数据
printf("\\n\\r");
定义发送变量。
uint8_t rxbuffer[10];//接收数组
uint8_t rx_size = 10;//需要接收长度
__IO uint16_t rxcount = 0; //实际接收长度
串口中断定义。
/*!
\\brief this function handles USART RBNE interrupt request and TBE interrupt request
\\param[in] none
\\param[out] none
\\retval none
*/
void USART0_IRQHandler(void)
{
if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){
/* receive data */
rxbuffer[rxcount++] = usart_data_receive(USART0);
if(rxcount == rx_size){
usart_interrupt_disable(USART0, USART_INT_RBNE);
}
}
if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE))//发送
{
/* transmit data */
usart_data_transmit(USART0, txbuffer[txcount++]);//发送一个八位数据
if(txcount == tx_size)//发送完毕
{
usart_interrupt_disable(USART0, USART_INT_TBE);//关闭发送中断
}
}
}
测试结果
审核编辑 黄昊宇
-
固件库
+关注
关注
2文章
97浏览量
14918 -
gd32f303
+关注
关注
4文章
38浏览量
3669
发布评论请先 登录
相关推荐
评论