初次接触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);
}
}