初次接触RISC-V的单片机,也是初次接触TencentOS系统,还在努力学习中,最近用到了重映射功能,与大家分享。
单片机为沁恒的CH32V307VCT6,板子为TencentOS RISC-V 开发板,程序是在例程EXAM-Demo-Project中做的修改。
原计划是使用UART7扩展几个传感器上传云端,但是UART7的接收有点bug,无法触发中断,原因未知。幸好发现在沁恒的CH32FV2x_V3x 系列应用手册中提到了重映射功能,在AFIO_PCFR1寄存器中可以将USART3映射到了PD8和PD9引脚。
程序方面实现了UART3的接收中断将收到的数据发回,task1 将接收数据的长度显示出来。
重映射程序如下:
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
将接收中断的数据发回的代码就很容易实现了。
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);
}
}
显示的程序也很简单
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);
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。