[GD32F310评测]通信USART配置和ECHO例程
[复制链接]
最近时间比较紧张,先搞定串口通信程序。本次实现的串口通信程序,RX为异步发送,TX为接收端,通过中断实现。为了验证串口收发功能的正常运行,使用ECHO来验证模块工作。
串口初始化的过程可以划分成三个步骤:
rcu_periph_clock_enable(RCU_USART0); // USART0
usart_clock_enable(USART0);
gpio_mode_set(GPIOB,GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_6); // TX
gpio_af_set(GPIOB,GPIO_AF_1,GPIO_PIN_6); // TX
gpio_mode_set(GPIOB,GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_7); // RX
gpio_af_set(GPIOB,GPIO_AF_1,GPIO_PIN_7); // RX
usart_baudrate_set(USART0, 115200); // baudrate
usart_parity_config(USART0,USART_PM_NONE); // parity
usart_word_length_set(USART0,USART_WL_8BIT); // word length
usart_stop_bit_set(USART0,USART_STB_1BIT); // stop bit
usart_transmit_config(USART0,USART_TRANSMIT_ENABLE); // Setup TX
usart_receive_config(USART0,USART_RECEIVE_ENABLE); // Setup RX
usart_data_first_config(USART0,USART_MSBF_LSB); // LSB
usart_receiver_timeout_enable(USART0); // receiver timeout
usart_receiver_timeout_threshold_config(USART0,0x0000FFFF);
usart_enable(USART0);
USART的接收、发送的DMA可以通过下面的程序实现:
// USART RX INT
usart_interrupt_enable(USART0,USART_INT_RBNE);
nvic_irq_enable(USART0_IRQn, 2U, 2U); // GPIO A0 -> EXTI 0
// USART RX DMA
usart_dma_transmit_config(USART0,USART_DENT_ENABLE);
dma_usart_rx.periph_addr = USART0;
dma_usart_rx.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; // 1 byte
dma_usart_rx.memory_addr = (uint32_t)(usart_rx);
dma_usart_rx.memory_width = DMA_PERIPHERAL_WIDTH_8BIT; // 1 byte
dma_usart_rx.memory_inc = (uint8_t)DMA_MEMORY_INCREASE_DISABLE;
dma_usart_rx.number = RX_BUFFER_LEN; // buffer size
dma_usart_rx.priority = (uint32_t)DMA_PRIORITY_LOW;
dma_init(DMA_CH1, &dma_usart_rx);
dma_transfer_direction_config(DMA_CH1,DMA_MEMORY_TO_PERIPHERAL);
dma_channel_enable(DMA_CH1);
测试的时候,编写了一个可以实现发送的例程:
void print(const char* p_fmt, ...)
{
//char str[TX_BUFFER_LEN];
uint8_t len;
int i;
#if 0
va_list vArgs;
va_start(vArgs, p_fmt);
vsprintf((char*)str, (char const*)p_fmt, vArgs); // This function haven't been realized.
va_end(vArgs);
#endif
len = strlen(p_fmt);
for(i=0;i<len;++i)
{
while(usart_flag_get(USART0,USART_FLAG_TBE) != SET)
{
int temp_delay = 0;
if(temp_delay < TX_MAX_DELAY)
++temp_delay;
else
break;
}
USART_TDATA(USART0) = (USART_TDATA_TDATA & p_fmt);
}
return ;
}
结果发现函数vsprintf 并没有被实现,所以只是暂时滥竽充数了一下。
实现了一个简单的测试功能:
// Loop
static uint32_t loop_index = 0;
if(loop_index == 0)
{
print("Main Loop is running!\r\n");
loop_index = 0x2FFFF;
}
else
{
loop_index -= 1;
}
实现了一个简单的ECHO
void USART0_IRQHandler(void)
{
if(usart_interrupt_flag_get(USART0,USART_INT_FLAG_RBNE) == SET)
{
// React receive message
while(usart_flag_get(USART0,USART_FLAG_TBE) != SET)
{
static unsigned int temp_delay = 0;
if(temp_delay < TX_MAX_DELAY)
++temp_delay;
else
break;
}
USART_TDATA(USART0) = (USART_TDATA_TDATA & (USART_RDATA(USART0))); // 反手送出去同时消除标志位
}
}
下次作为压轴调试SVPWM的调制器。
|