#申请原创# @21小跑堂
串口在开发调试和设备通讯中会经常用到,开发板上引出了USART1连接到了ATLINK上,PA9可以通过跳线帽选择是作为串口的TX还是usb的VBUS,默认是作为串口TX
在AT32 Work Bench中开启USART1,在这里可以直接配置串口的各项参数
开启串口中断
需要注意的是生成的代码需要自己写上开启中断的代码
简单写个收发测试
- #define UART_BUFFER_LEN 20
- uint8_t uart_buffer[UART_BUFFER_LEN] = {0};
- uint8_t uart_rxindex = 0;
- uint8_t uart_rxlen = 0;
- uint8_t uart_txindex = 0;
- uint8_t uart_txlen = 0;
- void starttx()
- {
- uart_txlen += uart_rxlen;
- uart_rxlen = 0;
- usart_interrupt_enable(USART1, USART_TDBE_INT, TRUE);
- }
- void usart1_irq()
- {
- if(usart_flag_get(USART1, USART_RDBF_FLAG) != RESET)
- {
- usart_flag_clear(USART1, USART_RDBF_FLAG);
- uart_buffer[uart_rxindex++] = usart_data_receive(USART1);
- if(uart_rxindex == UART_BUFFER_LEN)
- uart_rxindex = 0;
- uart_rxlen++;
- }
- if(usart_flag_get(USART1, USART_IDLEF_FLAG) != RESET || uart_rxlen == UART_BUFFER_LEN/2)
- {
- usart_flag_clear(USART1, USART_IDLEF_FLAG);
- starttx();
- }
- if(usart_flag_get(USART1, USART_TDBE_FLAG) != RESET)
- {
- usart_flag_clear(USART1, USART_TDBE_FLAG);
- if(uart_txlen > 0)
- {
- usart_data_transmit(USART1, uart_buffer[uart_txindex++]);
- if(uart_txindex == UART_BUFFER_LEN)
- uart_txindex = 0;
- uart_txlen--;
- }
- else
- {
- usart_interrupt_enable(USART1, USART_TDBE_INT, FALSE);
- }
- }
- }
- void USART1_IRQHandler(void)
- {
- /* add user code begin USART1_IRQ 0 */
- extern void usart1_irq();
- usart1_irq();
- /* add user code end USART1_IRQ 0 */
- /* add user code begin USART1_IRQ 1 */
- /* add user code end USART1_IRQ 1 */
- }
运行效果
接下来重定向printf输出到串口,实现之后输出调试信息会很方便,在工程设置中勾选Use MicroLib
在代码中添加
- int fputc(int ch, FILE *f)
- {
- while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
- usart_data_transmit(USART1,ch&0xFF);
- return ch;
- }
简单测试,按下按键打印
- uint8_t num = 0;
- void userkey_int()
- {
- if(gpio_input_data_bit_read(USER_BTN_GPIO_PORT, USER_BTN_PIN) != RESET)
- {
- printf("printf test %d",num);
- num += 1;
- }
- }
运行效果
在固件包提供的at32f423_board中已经实现了printf重定向,如果使用这个文件就不用自己再实现了
|