打印
[CW32F030系列]

【CW32F030FxPx StartKit开发板】1、开发板初体验

[复制链接]
709|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创# @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刷卡部分代码,与继电器模块和语音模块进行联动,来实现一个简易版本的射频识别门禁系统,敬请期待~

使用特权

评论回复
沙发
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口可以进行串口通讯嘛?

使用特权

评论回复
5
Estelle1999|  楼主 | 2024-6-12 20:29 | 只看该作者
小小蚂蚁举千斤 发表于 2024-6-11 16:04
请问USBMini口可以进行串口通讯嘛?

不能直接通讯,还得用条线,让MCU的串口与CH340接在一起才行

使用特权

评论回复
6
AdaMaYun| | 2024-6-13 19:46 | 只看该作者
请问芯源的MCU速率怎么样?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

1255

帖子

2

粉丝