[CW32F030系列] 【CW32F030FxPx StartKit开发板】1、开发板初体验

[复制链接]
 楼主| Estelle1999 发表于 2024-6-5 23:35 | 显示全部楼层 |阅读模式
#申请原创# @21小跑堂
@21ic小管家  

收到CW32F030FxPx StartKit开发板有几天了,真的很开心,这是第一次使用武汉芯源的芯片方案来考虑做个小玩意儿,其实关注武汉芯源已经很久了,发现他家做MCU很有特色,其宽电压供电,很优秀的ADC外设,并且M0+内核的优质设计,真的让人很难不爱。本次拿到的是CW32F030FxPx StartKit开发板,其最高主频64MHz,其封装采用的是TSSOP20封装,在做一些小型化,IO占用比较少的方案中非常有优势。好了,简单的介绍完了,就来看看CW32F030FxPx StartKit开发板的真面目吧。
796130cfa94e559535e3d091482477b2
图1 CW32F030FxPx StartKit开发板
这款开发板采用的是miniUSB接口,其实这里建议厂家如果可以换成Type-C接口,就好多了,因为现在大家用的type-c比较多,而miniUSB确实用的较少了。其次,电源采用的是AMS1117-3.3,这是一颗LDO芯片,USB转串口芯片CH340N,两颗存储芯片,一颗是华邦品牌W25Q64的flash存储芯片,一颗是型号24C02的eeprom芯片,这两颗芯片采用条线的方式与MCU相连接,这样可以最大限度的让MCU的IO都利用起来,很不错的设计。板载还有2个用户按键,1个复位按键,2颗用户使用的LED,1颗电源指示,至此,电路板的硬件部分大致是介绍完成了。
接下来就针对开发来讲讲软件,武汉芯源支持Keil与IAR开发环境进行程序开发,本次我将采用keil进行对CW32F030FxPx StartKit开发板,大家都知道,采用keil开发的话,一般是需要pack的,所以需要下载一个固件库包。
38ada51da4f603df02e2be4fd6678967
图2 CW32F030FxPx 的pack安装包安装界面
打开之后,双击PS.CW32F030_DFP.1.0.0.pack,就可以安装pack支持包了。
安装好支持包之后,就需要找个例程或者自己搭建个开发环境,本次选择的是使用官方的例程UART_Printf作为开发环境,这样就可以减少因搭建环境而导致的编译错误问题。
打开例程之后,需要进行一些设置。由于针对CW32F030FxPx的存储是32K的flash和6K的arm,所以设置应如下:
9a4a89f015472a00fb3cadb0d3fb4b56
图3 CW32F030FxPx 的存储配置部分
Ps:不知道为什么,就算是这块不做修改也能烧录与运行,但是按理来说应该烧录不进去才对。
接下来链接link,我本次使用的是创芯工坊的PWlink2,采用的是daplink模式,然后在flashdownload中选择对应的flm即可。
a1b59533c83fd57285fd86127abccd4a
图4 CW32F030FxPx的仿真器部分配置
至此,硬件环境搭建基本完成,这里就可以愉快的进行程序编写了。
由于使用的是CW32F030FxPx,而官方例程采用的是CW32F030C8,因此有些管脚需要进行修改。比如原来例程中用的是PA9和PA8,那么由于CW32F030FxPx没有,所以就需要用到PA2和PA3.
代码如下:
  1. //UARTx
  2. #define  DEBUG_USARTx                   CW_UART3
  3. #define  DEBUG_USART_CLK                RCC_APB1_PERIPH_UART3
  4. #define  DEBUG_USART_APBClkENx          RCC_APBPeriphClk_Enable1
  5. #define  DEBUG_USART_BaudRate           9600
  6. #define  DEBUG_USART_UclkFreq           8000000

  7. //UARTx GPIO
  8. #define  DEBUG_USART_GPIO_CLK           RCC_AHB_PERIPH_GPIOA
  9. #define  DEBUG_USART_TX_GPIO_PORT       CW_GPIOA
  10. #define  DEBUG_USART_TX_GPIO_PIN        GPIO_PIN_2
  11. #define  DEBUG_USART_RX_GPIO_PORT       CW_GPIOA
  12. #define  DEBUG_USART_RX_GPIO_PIN        GPIO_PIN_3

  13. //GPIO AF
  14. #define  DEBUG_USART_AFTX               PA02_AFx_UART3TXD()
  15. #define  DEBUG_USART_AFRX               PA03_AFx_UART3RXD()
  1. void GPIO_Configuration(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure;
  4.     //UART TX RX 复用
  5.     DEBUG_USART_AFTX;
  6.     DEBUG_USART_AFRX;
  7.     GPIO_InitStructure.Pins = DEBUG_USART_TX_GPIO_PIN;
  8.     GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  9.     GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
  10.     GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
  11.     GPIO_InitStructure.Pins = DEBUG_USART_RX_GPIO_PIN;
  12.     GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
  13.     GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
  14. }

  15. /**
  16. * [url=home.php?mod=space&uid=247401]@brief[/url] 配置UART
  17. *
  18. */
  19. void UART_Configuration(void)
  20. {
  21.     USART_InitTypeDef USART_InitStructure;
  22.     USART_InitStructure.USART_BaudRate = DEBUG_USART_BaudRate;
  23.     USART_InitStructure.USART_Over = USART_Over_16;
  24.     USART_InitStructure.USART_Source = USART_Source_PCLK;
  25.     USART_InitStructure.USART_UclkFreq = DEBUG_USART_UclkFreq;
  26.     USART_InitStructure.USART_StartBit = USART_StartBit_FE;
  27.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  28.     USART_InitStructure.USART_Parity = USART_Parity_No ;
  29.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  30.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  31.     USART_Init(DEBUG_USARTx, &USART_InitStructure);
  32. }

配置好之后就可以烧录试试了,使用串口助手软件,波特率配置成9600,可以看到串口接收界面显示了“CW32F030 UART Printf Example”
4d1016222d746b650c6f3ffd1d7aacea
图4 CW32F030FxPx的串口显示
这里就相当于串口调试成功了,不过由于我的项目需要语音播报,发现语音播报还是采用的串口,那么我们再找一组串口进行控制语音吧,这里选择的是PA6与PA7
代码如下:
定义的串口2函数:
  1. void UART2_Init(void)
  2. {
  3.     /*-------时钟使能---------*/
  4.     __RCC_UART2_CLK_ENABLE(); //使能串口UART2
  5.     __RCC_GPIOA_CLK_ENABLE(); //使能GPIOA

  6.     /*-------引脚复用配置---------*/
  7.     PA06_AFx_UART2TXD();        //PA6_MCU_TX --> RX
  8.     PA07_AFx_UART2RXD();         //PA7_MCU_RX --> TX

  9.     GPIO_InitTypeDef GPIO_InitStructure;
  10.     GPIO_InitStructure.Pins = GPIO_PIN_6;
  11.     GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;  //推挽输出
  12.     GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
  13.     GPIO_Init(CW_GPIOA, &GPIO_InitStructure);

  14.     GPIO_InitStructure.Pins = GPIO_PIN_7;
  15.     GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP; //上拉输入
  16.     GPIO_Init(CW_GPIOA, &GPIO_InitStructure);

  17.     /*-------串口2配置---------*/
  18.     USART_InitTypeDef USART_InitStructure;
  19.     USART_InitStructure.USART_BaudRate = 9600;              //波特率
  20.     USART_InitStructure.USART_Over = USART_Over_16;         //采样方式(噪声处理)
  21.     USART_InitStructure.USART_Source = USART_Source_PCLK;   //时钟来源
  22.     USART_InitStructure.USART_UclkFreq = DEBUG_USART_UclkFreq;          //8MHz
  23.     USART_InitStructure.USART_StartBit = USART_StartBit_FE; //起始位判断方式(下降沿)
  24.     USART_InitStructure.USART_StopBits = USART_StopBits_1;  //停止位长度(1)
  25.     USART_InitStructure.USART_Parity = USART_Parity_No ;    //校验方式(无)
  26.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控(无)
  27.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //发送/接收使能
  28.     USART_Init(CW_UART2, &USART_InitStructure);
  29. }

  30. void UASRT2_SendByte(uint8_t Byte)
  31. {
  32.     USART_SendData_8bit(CW_UART2, Byte);

  33.     while(USART_GetFlagStatus(CW_UART2, USART_FLAG_TXE) == RESET); //等待发送完成

  34.     USART_ClearFlag(CW_UART2, USART_FLAG_TXE);
  35. }

  36. void USART2_SendString(char *String)
  37. {
  38.     while(*String != '\0')
  39.     {
  40.         USART_SendData_8bit(CW_UART2, *String);

  41.         while(USART_GetFlagStatus(CW_UART2, USART_FLAG_TXE) == RESET); //等待发送完成

  42.         USART_ClearFlag(CW_UART2, USART_FLAG_TXE);
  43.         String++;
  44.     }

  45.     while(USART_GetFlagStatus(CW_UART2, USART_FLAG_TXBUSY) == SET); //等待数据发送完成
  46. }

  47. void USART2_SendData(uint8_t *data, uint16_t size)
  48. {
  49.     for (uint16_t i = 0; i < size; i++)
  50.     {
  51.         USART_SendData_8bit(CW_UART2,data[i]);
  52.                                 while(USART_GetFlagStatus(CW_UART2, USART_FLAG_TXE) == RESET); //等待发送完成
  53.                                 USART_ClearFlag(CW_UART2, USART_FLAG_TXE);
  54.     }
  55. }

配置好之后,我是采用的JR6001语音模块,该模块采用的是串口控制,事先需要录制好音频。
1abe8d274e56345574f1a2422e29ccfa
图5生成想要的语音
300cc380cc964786dda2a48576b5efd0
图6 修剪好语音,并且设定其需要的格式
语音做好之后,就可以放入到模块模拟好的U盘之中。
f8b45033fe13da12a23f4f2ee9cca787
图7修剪好语音,放入到U盘之中
b391e728c0bebabad82dc3c17d89248a
图8利用调试工具来获得如何控制模块播放的指令
图八看起来有些复杂,其实就是利用串口,将调试工具显示的发送数据内容,发送给语音模块即可,比如想要发送A7:00001 就可以发送“41 37 3A 30 30 30 30 31”这一串就可以。
定义的语音数组:
  1. uint8_t Voice01[8] = {0x41, 0x37, 0x3A, 0x30, 0x30, 0x30, 0x30, 0x31};//欢迎光临
  2. uint8_t Voice02[8] = {0x41, 0x37, 0x3A, 0x30, 0x30, 0x30, 0x30, 0x32};//卡无权限
  3. uint8_t Voice03[8] = {0x41, 0x37, 0x3A, 0x30, 0x30, 0x30, 0x30, 0x33};//刷卡成功
  4. uint8_t VoiceUp[5] = {0x41, 0x46, 0x3A, 0x33, 0x31}; //设置声音最大
  1. 主函数代码:
  2. int32_t main(void)
  3. {
  4.     //配置RCC
  5.     RCC_Configuration();
  6.     //配置GPIO
  7.     GPIO_Configuration();
  8.                 UART2_Init();
  9.     //配置UART
  10.     UART_Configuration();
  11.     printf("\r\nCW32F030 UART Printf Example\r\n");
  12.                 USART2_SendData(Voice01,8);
  13.     while (1)
  14.     {
  15. }
  16. }

67eb2b6af5adb3bfe6aa9affda4c4726
图9调试效果
接下来我将加入RC522刷卡部分代码,与继电器模块和语音模块进行联动,来实现一个简易版本的射频识别门禁系统,敬请期待~

weifeng90 发表于 2024-6-6 07:40 来自手机 | 显示全部楼层
要是有板载link电路就好了
 楼主| Estelle1999 发表于 2024-6-6 11:11 | 显示全部楼层
weifeng90 发表于 2024-6-6 07:40
要是有板载link电路就好了

确实,而且这个芯片由于IO较少,发现SWD接口都给复用了,很容易出现烧录之后不能仿真调试/不能再下载的情况。所以,使用这芯片的时候建议不要占用SWD接口哦
小小蚂蚁举千斤 发表于 2024-6-11 16:04 | 显示全部楼层
请问USBMini口可以进行串口通讯嘛?
 楼主| Estelle1999 发表于 2024-6-12 20:29 | 显示全部楼层
小小蚂蚁举千斤 发表于 2024-6-11 16:04
请问USBMini口可以进行串口通讯嘛?

不能直接通讯,还得用条线,让MCU的串口与CH340接在一起才行
AdaMaYun 发表于 2024-6-13 19:46 | 显示全部楼层
请问芯源的MCU速率怎么样?
jf101 发表于 2024-6-27 22:09 | 显示全部楼层
小小蚂蚁举千斤 发表于 2024-6-11 16:04
请问USBMini口可以进行串口通讯嘛?

肯定是可以的,但整体要进行设置配置
szt1993 发表于 2024-6-28 11:27 | 显示全部楼层
板载还有2个用户按键,1个复位按键,2颗用户使用的LED,1颗电源指示
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

1567

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部