本次主要测试一下串口。使用中断接收数据。串口初始化:
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] initialize uart
* @param baudrate: uart baudrate
* @retval none
*/
void uart_print_init(uint32_t baudrate)
{
gpio_init_type gpio_init_struct;
/* enable the uart and gpio clock */
crm_periph_clock_enable(PRINT_UART_CRM_CLK, TRUE);
crm_periph_clock_enable(PRINT_UART_TX_GPIO_CRM_CLK, TRUE);
gpio_default_para_init(&gpio_init_struct);
/* configure the uart tx pin */
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
gpio_init_struct.gpio_pins = PRINT_UART_TX_PIN | PRINT_UART_RX_PIN;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(PRINT_UART_TX_GPIO, &gpio_init_struct);
gpio_pin_mux_config(PRINT_UART_TX_GPIO, PRINT_UART_TX_PIN_SOURCE, PRINT_UART_TX_PIN_MUX_NUM);
gpio_pin_mux_config(PRINT_UART_RX_GPIO, PRINT_UART_RX_PIN_SOURCE, PRINT_UART_RX_PIN_MUX_NUM);
/* configure uart param */
usart_init(PRINT_UART, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);
usart_transmitter_enable(PRINT_UART, TRUE);
usart_receiver_enable(PRINT_UART, TRUE);
/* enable usart RX interrupt */
usart_interrupt_enable(PRINT_UART, USART_RDBF_INT, TRUE);
usart_enable(PRINT_UART, TRUE);
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
nvic_irq_enable(PRINT_UART_IRQn, 0, 0);
}
中断接收,通过fifo缓存方式存储接收的数据。
/**
* @brief this function handles usart1 handler.
* @param none
* @retval none
*/
void USART1_IRQHandler(void)
{
if(usart_flag_get(PRINT_UART, USART_RDBF_FLAG) != RESET)
{
gpio_bits_toggle(LED3_GPIO,LED3_PIN);
fifo_push(&print_uart_rx,usart_data_receive(PRINT_UART));
}
}
下面实现printf打印。首先在pack内选择如下:
然后添加 int stdout_putchar (int ch)函数就可以了int stdout_putchar (int ch)
{
while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
usart_data_transmit(PRINT_UART, (uint16_t)ch);
while(usart_flag_get(PRINT_UART, USART_TDC_FLAG) == RESET);
return ch;
}
main函数测试printf以及串口发送接收数据:
int main(void)
{
uint8_t ch;
volatile int32_t i=0;
system_clock_config();
SysTick_Config(SystemCoreClock/1000);
at32_led_init();
at32_button_init();
uart_print_init(115200);
printf("at32f423 board print test.\r\n");
while(1)
{
gpio_bits_toggle(LED2_GPIO,LED2_PIN);
Delay_ms(200);
if(fifo_pop(&print_uart_rx,&ch) == 0)
{
gpio_bits_toggle(LED4_GPIO,LED4_PIN);
stdout_putchar(ch);
}
}
}
下面移植串口shell:nr_micro_shell。
首先下载nr_micro_shell源码,添加到工程目录。
然后添加头文件路径:
下面配置shell。主要是如下配置函数,其他的按需要配置。
最后需要添加nr_micro_shell.h,以及初始化和字符输入处理。
串口助手测试效果
程序:
demo.zip
(1.47 MB)
|