前言
串口作为单片机上最常用的外设,在开发调试及与其他设备通讯中扮演了重要角色。在参考了众多前人方案后,最终决定自己写一个小demo。由于手里的调试器不断报错,新买的调试器还有好久才能到,只好先放出demo来。
硬件准备
Sipeed Longan Nano × 1
RV Debugger × 1
跳线帽 × 1
开发环境
Nuclei Studio
工程模板
Baremetal_helloworld
开始干活
由于USART0一般都作为调试用或者与上位机通讯用的串口,在与外部设备通讯时使用该串口并不方便。查阅文档后决定使用USART2作为与其他设备通讯的工作串口,该串口被映射到了PB10(TX),PB11(RX),且5V容忍,适用范围比USART1稍微广一些。
程序实现在main函数中通过串口2发送数字1~20,同时通过串口2接收发来的数据并通过串口0打印出来。
硬件连接:跳线帽短接PB10,PB11
程序:
void USART2_IRQHandler(void){
if(usart_interrupt_flag_get(USART2, USART_INT_FLAG_RBNE) != RESET){
uint8_t serial_recv = usart_data_receive(USART2);
printf("%d",serial_recv);
}
}
int main(void)
{
printf("Hello World\r\n");
rcu_periph_clock_enable(RCU_GPIOB); //enable GPIO clock, PB10/PB11
rcu_periph_clock_enable(RCU_USART2); //enable USART clock
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10); //PB10--TX2
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_11); //PB11--RX2
usart_deinit(USART2);
usart_baudrate_set(USART2,9600U); // 9600
usart_word_length_set(USART2,8); // 8
usart_parity_config(USART2,USART_PM_NONE); //N
usart_stop_bit_set(USART2,1);// 1
usart_receive_config(USART2, USART_RECEIVE_ENABLE); // 使能串口接收
usart_transmit_config(USART2, USART_TRANSMIT_ENABLE); // 是能串口发送
usart_interrupt_enable(USART2,USART_INT_RBNE); //使能接收中断
ECLIC_Register_IRQ(USART2_IRQn,ECLIC_NON_VECTOR_INTERRUPT,ECLIC_LEVEL_TRIGGER,1,0,USART2_IRQHandler); // 配置中断函数
__enable_irq();
usart_enable(USART2);
for (int i = 1; i <= 20; i ++) {
usart_data_transmit(USART2,i);
while ( usart_flag_get(USART2, USART_FLAG_TBE)== RESET){}; // 等待发送完成
}
delay_1ms(200);
printf("\r\n FINISH\r\n");
return 0;
}
以上代码只能说是将就着能跑,距离能实际使用还有很大差距
吐槽
Sipeed Longan Nano + RV Debugger 使用起来真的心惊胆战,带电插拔一下跳线帽,或者碰一下电源线,接下来就是无尽的
Error: Unsupported DTM version: 12
Info : Listening on port 3333 for gdb connections
Error: Target not examined yet