[应用方案] 基于芯圣CS32F030F4P6 MCU的项目开发与代码实现

[复制链接]
 楼主| Clyde011 发表于 2024-10-9 09:12 | 显示全部楼层 |阅读模式

芯圣CS32F030F4P6是一个性价比较高的32位ARM Cortex-M0内核微控制器。它以其低功耗、高性能、丰富的外设资源和易于开发的特性,受到广泛应用于嵌入式系统开发的关注。本文将基于该MCU进行一个简单的GPIO控制和串口通信的项目开发,并展示对应的代码实现。

芯圣CS32F030F4P6的主要特性:
  • 32位ARM Cortex-M0内核
  • 16KB Flash存储器,4KB SRAM
  • 工作频率高达48MHz
  • 内置丰富的外设资源:GPIO、UART、I2C、SPI等
  • 低功耗模式

在本文中,我们将展示一个基于CS32F030F4P6的简单项目,主要包括以下功能:
  • GPIO控制LED的点亮与熄灭
  • 基于按键控制LED状态
  • 串口通信,通过UART发送数据

1. 硬件环境
  • 芯圣CS32F030F4P6开发板
  • 一个LED
  • 一个按键
  • 串口调试工具(如串口助手)

2. 软件开发环境
  • Keil MDK (ARM)
  • STM32CubeMX(配置外设)

3. 项目代码实现代码部分包括系统时钟的配置、GPIO的初始化、UART的初始化以及按键控制LED的逻辑。
  1. #include "cs32f0xx.h"  // 芯圣CS32F030F4P6的头文件

  2. // 系统时钟初始化
  3. void SystemClock_Config(void) {
  4.     RCC_HSEConfig(RCC_HSE_ON);
  5.     while (RCC_WaitForHSEStartUp() == ERROR);
  6.     RCC_HCLKConfig(RCC_SYSCLK_Div1);
  7.     RCC_PCLKConfig(RCC_HCLK_Div1);
  8.     FLASH_SetLatency(FLASH_Latency_1);
  9.     RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
  10.     while (RCC_GetSYSCLKSource() != 0x04);
  11. }

  12. // GPIO初始化
  13. void GPIO_Init(void) {
  14.     GPIO_InitTypeDef GPIO_InitStructure;

  15.     // LED引脚配置
  16.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);  // 开启GPIOC时钟
  17.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  18.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  19.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  20.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  21.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  22.     GPIO_Init(GPIOC, &GPIO_InitStructure);

  23.     // 按键引脚配置
  24.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  // 开启GPIOA时钟
  25.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  26.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  27.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  28.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  29. }

  30. // 串口初始化
  31. void UART_Init(void) {
  32.     USART_InitTypeDef USART_InitStructure;
  33.     GPIO_InitTypeDef GPIO_InitStructure;

  34.     // 开启串口和GPIO时钟
  35.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  36.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  37.     // 配置串口引脚
  38.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
  39.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  40.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  41.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  42.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  43.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  44.     // 串口复用设置
  45.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);  // PA9为TX
  46.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1); // PA10为RX

  47.     // 配置串口
  48.     USART_InitStructure.USART_BaudRate = 9600;
  49.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  50.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  51.     USART_InitStructure.USART_Parity = USART_Parity_No;
  52.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  53.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  54.     USART_Init(USART1, &USART_InitStructure);

  55.     // 开启串口
  56.     USART_Cmd(USART1, ENABLE);
  57. }

  58. // 按键控制LED
  59. void ControlLED(void) {
  60.     if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == RESET) {
  61.         GPIO_ResetBits(GPIOC, GPIO_Pin_13);  // 按下按键,点亮LED
  62.     } else {
  63.         GPIO_SetBits(GPIOC, GPIO_Pin_13);  // 松开按键,熄灭LED
  64.     }
  65. }

  66. // 串口发送字符串
  67. void UART_SendString(char* str) {
  68.     while (*str) {
  69.         USART_SendData(USART1, *str++);
  70.         while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  71.     }
  72. }

  73. // 主函数
  74. int main(void) {
  75.     SystemClock_Config();  // 初始化系统时钟
  76.     GPIO_Init();           // 初始化GPIO
  77.     UART_Init();           // 初始化串口

  78.     while (1) {
  79.         ControlLED();  // 按键控制LED
  80.         UART_SendString("Hello, CS32F030F4P6!");  // 通过串口发送数据
  81.     }
  82. }
代码解析
  • 系统时钟配置:系统时钟选择外部高频晶振(HSE),并设置HCLK和PCLK为1倍分频。
  • GPIO初始化:配置了PC13为推挽输出模式,用于LED的控制;PA0为上拉输入模式,用于按键读取。
  • 串口初始化:USART1配置波特率为9600,采用8位数据、1位停止位、无校验和无硬件流控制,用于与PC进行通信。
  • 按键控制LED的实现:通过检测PA0的电平状态来控制PC13上LED的点亮和熄灭。
  • 串口通信:串口每次循环都会发送"Hello, CS32F030F4P6!"字符串到PC终端。

项目总结本项目通过CS32F030F4P6 MCU实现了简单的GPIO控制和串口通信功能。在实际应用中,芯圣的这款MCU可以灵活应用于各种嵌入式开发场景,比如智能家居、物联网设备等。通过GPIO控制外设,串口实现与外部设备的通信,为后续的功能扩展提供了坚实的基础。


公羊子丹 发表于 2024-10-9 09:12 | 显示全部楼层
这个代码看起来挺简单的,初学者都能轻松上手
周半梅 发表于 2024-10-9 09:13 | 显示全部楼层
看来这个芯圣的MCU性价比不错啊,适合小项目开发
帛灿灿 发表于 2024-10-9 09:13 | 显示全部楼层
有没有可能把这个串口的波特率调高一点?速度会不会更快?
童雨竹 发表于 2024-10-9 09:13 | 显示全部楼层
刚好手上有块CS32F030的板子,正好试试这段代码
万图 发表于 2024-10-9 09:14 | 显示全部楼层
代码写得挺清晰的,学到了不少东西
Wordsworth 发表于 2024-10-9 09:14 | 显示全部楼层
请问这个项目能加个PWM控制吗?我想试试LED的亮度调节
Pulitzer 发表于 2024-10-9 09:15 | 显示全部楼层
我这边用的工具和你一样,代码直接跑通了,非常感谢
Bblythe 发表于 2024-10-9 09:15 | 显示全部楼层
小项目先用这种便宜的MCU开发一下,再往大项目移植也是个好办法
Uriah 发表于 2024-10-9 09:16 | 显示全部楼层
有没有I2C或者SPI的通信例程?想尝试多设备通信
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

5508

帖子

0

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