#申请原创# @21小跑堂
@21ic小管家
收到CW32F030FxPx StartKit开发板有几天了,真的很开心,这是第一次使用武汉芯源的芯片方案来考虑做个小玩意儿,其实关注武汉芯源已经很久了,发现他家做MCU很有特色,其宽电压供电,很优秀的ADC外设,并且M0+内核的优质设计,真的让人很难不爱。本次拿到的是CW32F030FxPx StartKit开发板,其最高主频64MHz,其封装采用的是TSSOP20封装,在做一些小型化,IO占用比较少的方案中非常有优势。好了,简单的介绍完了,就来看看CW32F030FxPx StartKit开发板的真面目吧。
图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的,所以需要下载一个固件库包。
图2 CW32F030FxPx 的pack安装包安装界面 打开之后,双击PS.CW32F030_DFP.1.0.0.pack,就可以安装pack支持包了。
安装好支持包之后,就需要找个例程或者自己搭建个开发环境,本次选择的是使用官方的例程UART_Printf作为开发环境,这样就可以减少因搭建环境而导致的编译错误问题。
打开例程之后,需要进行一些设置。由于针对CW32F030FxPx的存储是32K的flash和6K的arm,所以设置应如下:
图3 CW32F030FxPx 的存储配置部分 Ps:不知道为什么,就算是这块不做修改也能烧录与运行,但是按理来说应该烧录不进去才对。
接下来链接link,我本次使用的是创芯工坊的PWlink2,采用的是daplink模式,然后在flashdownload中选择对应的flm即可。
图4 CW32F030FxPx的仿真器部分配置 至此,硬件环境搭建基本完成,这里就可以愉快的进行程序编写了。
由于使用的是CW32F030FxPx,而官方例程采用的是CW32F030C8,因此有些管脚需要进行修改。比如原来例程中用的是PA9和PA8,那么由于CW32F030FxPx没有,所以就需要用到PA2和PA3.
代码如下:
//UARTx
#define DEBUG_USARTx CW_UART3
#define DEBUG_USART_CLK RCC_APB1_PERIPH_UART3
#define DEBUG_USART_APBClkENx RCC_APBPeriphClk_Enable1
#define DEBUG_USART_BaudRate 9600
#define DEBUG_USART_UclkFreq 8000000
//UARTx GPIO
#define DEBUG_USART_GPIO_CLK RCC_AHB_PERIPH_GPIOA
#define DEBUG_USART_TX_GPIO_PORT CW_GPIOA
#define DEBUG_USART_TX_GPIO_PIN GPIO_PIN_2
#define DEBUG_USART_RX_GPIO_PORT CW_GPIOA
#define DEBUG_USART_RX_GPIO_PIN GPIO_PIN_3
//GPIO AF
#define DEBUG_USART_AFTX PA02_AFx_UART3TXD()
#define DEBUG_USART_AFRX PA03_AFx_UART3RXD()
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//UART TX RX 复用
DEBUG_USART_AFTX;
DEBUG_USART_AFRX;
GPIO_InitStructure.Pins = DEBUG_USART_TX_GPIO_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pins = DEBUG_USART_RX_GPIO_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
}
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] 配置UART
*
*/
void UART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = DEBUG_USART_BaudRate;
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);
}
配置好之后就可以烧录试试了,使用串口助手软件,波特率配置成9600,可以看到串口接收界面显示了“CW32F030 UART Printf Example”
图4 CW32F030FxPx的串口显示 这里就相当于串口调试成功了,不过由于我的项目需要语音播报,发现语音播报还是采用的串口,那么我们再找一组串口进行控制语音吧,这里选择的是PA6与PA7 代码如下:
定义的串口2函数:
void UART2_Init(void)
{
/*-------时钟使能---------*/
__RCC_UART2_CLK_ENABLE(); //使能串口UART2
__RCC_GPIOA_CLK_ENABLE(); //使能GPIOA
/*-------引脚复用配置---------*/
PA06_AFx_UART2TXD(); //PA6_MCU_TX --> RX
PA07_AFx_UART2RXD(); //PA7_MCU_RX --> TX
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Pins = GPIO_PIN_6;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.Pins = GPIO_PIN_7;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP; //上拉输入
GPIO_Init(CW_GPIOA, &GPIO_InitStructure);
/*-------串口2配置---------*/
USART_InitTypeDef USART_InitStructure;
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; //8MHz
USART_InitStructure.USART_StartBit = USART_StartBit_FE; //起始位判断方式(下降沿)
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位长度(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_UART2, &USART_InitStructure);
}
void UASRT2_SendByte(uint8_t Byte)
{
USART_SendData_8bit(CW_UART2, Byte);
while(USART_GetFlagStatus(CW_UART2, USART_FLAG_TXE) == RESET); //等待发送完成
USART_ClearFlag(CW_UART2, USART_FLAG_TXE);
}
void USART2_SendString(char *String)
{
while(*String != '\0')
{
USART_SendData_8bit(CW_UART2, *String);
while(USART_GetFlagStatus(CW_UART2, USART_FLAG_TXE) == RESET); //等待发送完成
USART_ClearFlag(CW_UART2, USART_FLAG_TXE);
String++;
}
while(USART_GetFlagStatus(CW_UART2, USART_FLAG_TXBUSY) == SET); //等待数据发送完成
}
void USART2_SendData(uint8_t *data, uint16_t size)
{
for (uint16_t i = 0; i < size; i++)
{
USART_SendData_8bit(CW_UART2,data[i]);
while(USART_GetFlagStatus(CW_UART2, USART_FLAG_TXE) == RESET); //等待发送完成
USART_ClearFlag(CW_UART2, USART_FLAG_TXE);
}
}
配置好之后,我是采用的JR6001语音模块,该模块采用的是串口控制,事先需要录制好音频。
图5生成想要的语音 图6 修剪好语音,并且设定其需要的格式 语音做好之后,就可以放入到模块模拟好的U盘之中。
图7修剪好语音,放入到U盘之中 图8利用调试工具来获得如何控制模块播放的指令 图八看起来有些复杂,其实就是利用串口,将调试工具显示的发送数据内容,发送给语音模块即可,比如想要发送A7:00001 就可以发送“41 37 3A 30 30 30 30 31”这一串就可以。
定义的语音数组:
uint8_t Voice01[8] = {0x41, 0x37, 0x3A, 0x30, 0x30, 0x30, 0x30, 0x31};//欢迎光临
uint8_t Voice02[8] = {0x41, 0x37, 0x3A, 0x30, 0x30, 0x30, 0x30, 0x32};//卡无权限
uint8_t Voice03[8] = {0x41, 0x37, 0x3A, 0x30, 0x30, 0x30, 0x30, 0x33};//刷卡成功
uint8_t VoiceUp[5] = {0x41, 0x46, 0x3A, 0x33, 0x31}; //设置声音最大
主函数代码:
int32_t main(void)
{
//配置RCC
RCC_Configuration();
//配置GPIO
GPIO_Configuration();
UART2_Init();
//配置UART
UART_Configuration();
printf("\r\nCW32F030 UART Printf Example\r\n");
USART2_SendData(Voice01,8);
while (1)
{
}
}
图9调试效果 接下来我将加入RC522刷卡部分代码,与继电器模块和语音模块进行联动,来实现一个简易版本的射频识别门禁系统,敬请期待~
|