@21小跑堂 #申请原创# @21小跑堂
引:
拿到武汉芯源的开发板有一段时间了,一直想要摸索一下,毕竟是M0芯片,给我的感觉就是,M0要比M3芯片简单很多。实际还真不是这样,先把坑填平。
一、资料包下载
从官网下载资料包文件夹,如下:
PSMCU0052为软件开发包,里面的例程很少;
CW Programmer V1.53为编程工具;
CW32系列微控制器软件开发工具入门.PDF为开发工具入门;
PS.CW32F030_DFP.1.0.1.pack为keil的支持包
PSMCU0003.pdf为芯片手册
PSMCU0048.pdf为开发板使用手册
安装完PS.CW32F030_DFP.1.0.1.pack的keil支持包,这样在keil里面,就可以找到芯源的芯片了。
这样就证明已经安装完成这个资料包了。
这个芯片吸引人的地方是flash,8KRAM,而且自带CRC算法校验。在M0芯片里面,已经很棒了。
看看资源情况如下,我比较看好的是3个串口,而且可以映射。
看到资料包里面的文件,感觉少了很多例子代码,在调试完成之后,才发现的,希望不要犯我这种错误。重新进入官网,查看资料库。
将CW32F030_StdPeriph_Lib下载之后,可以看见所有的资源都包含了。
二、需要实现的功能
接收传感器的数据,然后通过串口在电脑的串口调试助手中打印出来。
三、简单的框图
从框图上,可以了解到,需要使用到开发板上的两个串口资源,而我们直接挂到传感器上的话,一定会出现很多问题,所以,我们从简单的情况入手,按照以下的框图先调通开发板上的两个串口。
而实际的线路板,远没有想象中那么规整。是这样的。
四、代码的调试
我使用的是开发包自带的代码进行调试,文件的目录如下:
根目录\CW32F030CxT6 StartKit REV01\PSMCU0052\PSMCU0052 CW32F030 StartKit软件包\StartKit Pack\Soft Example\CW32F030\board_test\
先将代码进行精简,不用的都删掉,main函数里面只留下如下部分:
int32_t main(void){ //配置RCC RCC_Configuration(); InitTick( SystemCoreClock ); //48000000 GPIO_Configuration(); UART_Configuration(); NVIC_Configuration(); while(1) { ; }}
保持其中的架构不变化,只需要配置里面的GPIO还有UART配置即可。我们使用的是PB6和PB7作为串口3来进行传输数据,使用PA8和PA9作为串口1进行传输数据。需要我们对端口进行重新映射一下。
void GPIO_Configuration(void){ GPIO_InitTypeDefGPIO_InitStructure; //UART TX RX 复用 PA08_AFx_UART1TXD(); PA09_AFx_UART1RXD(); GPIO_InitStructure.Pins = GPIO_PIN_8; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.IT = GPIO_IT_NONE; GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_Init(CW_GPIOA, &GPIO_InitStructure); GPIO_InitStructure.Pins = GPIO_PIN_9; GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP; GPIO_InitStructure.IT = GPIO_IT_NONE; GPIO_Init(CW_GPIOA, &GPIO_InitStructure); PB06_AFx_UART3TXD(); PB07_AFx_UART3RXD(); GPIO_InitStructure.Pins = GPIO_PIN_6; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.IT = GPIO_IT_NONE; GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_Init(CW_GPIOB, &GPIO_InitStructure); GPIO_InitStructure.Pins = GPIO_PIN_7; GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP; GPIO_InitStructure.IT = GPIO_IT_NONE; GPIO_Init(CW_GPIOB, &GPIO_InitStructure); }
紧跟着需要进行串口的配置,代码如下:
void UART_Configuration(void){ USART_InitTypeDefUSART_InitStructure; USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_Over = USART_Over_16; USART_InitStructure.USART_Source = USART_Source_PCLK; USART_InitStructure.USART_UclkFreq = DEBUG_USART_UclkFreq; USART_InitStructure.USART_StartBit = USART_StartBit_FE; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(DEBUG_USARTx, &USART_InitStructure); NVIC_SetPriority(UART1_IRQn,1); NVIC_EnableIRQ(UART1_IRQn); USART_ClearFlag(DEBUG_USARTx,USART_FLAG_RC); USART_ClearITPendingBit(DEBUG_USARTx,USART_IT_RC); USART_ITConfig(DEBUG_USARTx,USART_IT_RC,ENABLE); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_Over = USART_Over_16; USART_InitStructure.USART_Source = USART_Source_PCLK; USART_InitStructure.USART_UclkFreq = DEBUG_USART_UclkFreq; USART_InitStructure.USART_StartBit = USART_StartBit_FE; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(CW_UART3, &USART_InitStructure); NVIC_SetPriority(UART3_IRQn,1); NVIC_EnableIRQ(UART3_IRQn); USART_ClearFlag(CW_UART3,USART_FLAG_RC); USART_ClearITPendingBit(CW_UART3,USART_IT_RC); USART_ITConfig(CW_UART3,USART_IT_RC,ENABLE);}
最后在串口的中断函数中做一个收发逻辑,证明可以实现两个串口的收发工作。代码如下:
void UART1_IRQHandler(void){ if(USART_GetITStatus(CW_UART1,USART_IT_RC) != RESET) { USART_ClearITPendingBit(CW_UART1,USART_IT_RC); USART_SendData(CW_UART1,USART_ReceiveData(CW_UART1)); while(USART_GetFlagStatus(CW_UART1,USART_FLAG_TXE) == RESET); }}
void UART3_IRQHandler(void){ if(USART_GetITStatus(CW_UART3,USART_IT_RC) != RESET) { USART_ClearITPendingBit(CW_UART3,USART_IT_RC); USART_SendData(CW_UART3,USART_ReceiveData(CW_UART3)); while(USART_GetFlagStatus(CW_UART3,USART_FLAG_TXE) == RESET); }}
五、串口调试助手输出测试
将开发板和USB转串口工具分别接到电脑上,查看串口号。
分别是COM9和COM18
验证成功,证明两个uasrt口已经通了。
六、接上传感器并读数据
按照框图进行接线,然后在代码中修改读取传感器的协议,并通过串口实时打印到电脑中。这里需要注意的是传感器的AB口不要接反了。
最终呈现的效果如下:
结:
至此,开发板串口部分测试完毕,其它部分根据项目的需求进行整理。
|