开发者成长激励计划-基于TencentOS Tiny 的UART重映射

2022-07-23 21:56:40 浏览数 (2)

初次接触RISC-V的单片机,也是初次接触TencentOS系统,还在努力学习中,最近用到了重映射功能,与大家分享。

单片机为沁恒的CH32V307VCT6,板子为TencentOS RISC-V 开发板,程序是在例程EXAM-Demo-Project中做的修改。

原计划是使用UART7扩展几个传感器上传云端,但是UART7的接收有点bug,无法触发中断,原因未知。幸好发现在沁恒的CH32FV2x_V3x 系列应用手册中提到了重映射功能,在AFIO_PCFR1寄存器中可以将USART3映射到了PD8和PD9引脚。

程序方面实现了UART3的接收中断将收到的数据发回,task1 将接收数据的长度显示出来。

重映射程序如下:

代码语言:javascript复制
    GPIO_InitTypeDef  GPIO_InitStructure={0};
    USART_InitTypeDef USART_InitStructure={0};
    NVIC_InitTypeDef  NVIC_InitStructure={0};

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);//时钟

    GPIO_PinRemapConfig(GPIO_FullRemap_USART3,ENABLE);//重映射

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOD, &GPIO_InitStructure);// IO
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOD, &GPIO_InitStructure);// IO

将接收中断的数据发回的代码就很容易实现了。

代码语言:javascript复制
void USART3_IRQHandler(void)
{

    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
    //if(USART3->STATR &(1<<5))
  {
      co_data_RX[co_datanum]= USART_ReceiveData(USART3);
      USART_SendData(USART3,co_data_RX[co_datanum]);
      co_datanum  ;

  //    tos_at_uart_input_byte(&esp8266_tf_agent,data);
  }

}

显示的程序也很简单

代码语言:javascript复制
void task1_entry(void *arg)
{

    while (1)
    {
        LCD_ShowString(30,140 16 16 16 16,"UASRT3 Receive: ",WHITE,BLACK,16,0);
        LCD_ShowIntNum(30 16*8,140 16 16 16 16,co_datanum,5,WHITE,BLACK,16);
        LCD_ShowString(30 22*8,140 16 16 16 16,"Bytes",WHITE,BLACK,16,0);

        tos_task_delay(2000);
    }
}
EXAM-Demo-Project.zip

0 人点赞