1. 串口初始化
void BSP_USART0_Init(void)
{
/* enable GPIO clock */
rcu_periph_clock_enable(RCU_GPIOA);
/* enable USART clock */
rcu_periph_clock_enable(RCU_USART0);
/* connect port to USARTx_Tx */
gpio_init(USART0_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, USART0_TX_PIN);
/* connect port to USARTx_Rx */
gpio_init(USART0_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, USART0_RX_PIN);
/* configure USART */
usart_deinit(USART0);
usart_baudrate_set(USART0, 9600);
usart_word_length_set(USART0, USART_WL_8BIT);
usart_stop_bit_set(USART0, USART_STB_1BIT);
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_receiver_timeout_enable(USART0);
usart_receiver_timeout_threshold_config(USART0, 300);
nvic_irq_enable(USART0_IRQn, 0, 0);
usart_interrupt_enable(USART0, USART_INT_RBNE);//接收中断
usart_interrupt_enable(USART0, USART_INT_RT);//超时中断
}
2. 串口中断
void USART0_IRQHandler(void)
{
if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE) != RESET) //开始接受数据
{
/* receive data */
usart0msg.recv_buff[usart0msg.recv_index] = usart_data_receive(USART0);
usart0msg.recv_index++;
if(usart0msg.recv_index>=1500)
{
usart0msg.recv_index=0;
}
usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);
}
if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_RT) != RESET) //接收数据完成
{
usart0msg.recv_flag = 1;
usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RT);
}
}
3. 串口单字节发送
void BSP_USART0_Send_data(uint8_t ch)
{
usart_data_transmit(USART0, (uint8_t)ch);
while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
}
4. 串口数组发送
void BSP_USART0_SendBuf(uint8_t *pdata, uint8_t len)
{
uint8_t i = 0;
for(i = 0;i < len;i++)
{
BSP_USART0_Send_data(pdata[i]);
}
}
5. 串口字符串发送
void BSP_USART0_SendString(char *pdata, uint8_t len)
{
uint8_t i = 0;
for(i = 0;i < len;i++)
{
BSP_USART0_Send_data(pdata[i]);
}
}
串口配置时,串口中断中没有用到的中断标志,不要在配置中打开,否则会造成卡死在串口中断里
usart_receiver_timeout_enable(UART3);
usart_receiver_timeout_threshold_config(UART3, 300);
nvic_irq_enable(UART3_IRQn, 0, 0);
usart_interrupt_enable(UART3, USART_INT_RBNE);//接收中断
usart_interrupt_enable(UART3, USART_INT_RT);//超时中断
usart_interrupt_enable(UART3, USART_INT_TC);
例如这个配置使能了TC
void UART3_IRQHandler(void)
{
if(usart_interrupt_flag_get(UART3, USART_INT_FLAG_RBNE) != RESET) //开始接受数据
{
/* receive data */
uart3msg.recv_buff[uart3msg.recv_index] = usart_data_receive(UART3);
uart3msg.recv_index++;
if(uart3msg.recv_index>=1500)
{
uart3msg.recv_index=0;
}
usart_interrupt_flag_clear(UART3, USART_INT_FLAG_RBNE);
}
if(usart_interrupt_flag_get(UART3, USART_INT_FLAG_RT) != RESET) //接收数据完成
{
uart3msg.recv_flag = 1;
usart_interrupt_flag_clear(UART3, USART_INT_FLAG_RT);
}
// if(usart_interrupt_flag_get(UART3, USART_INT_FLAG_TC) != RESET) //发送数据完成
// {
// usart_interrupt_flag_clear(UART3, USART_INT_FLAG_TC);
// }
}
但是在中断中并没有使用TC,就会造成卡死在中断里的现象
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_53961291/article/details/145260449
|