#申请原创# @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重定向,如果使用这个文件就不用自己再实现了
|