你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32C0评测】C071:GPIO+定时器+串口

[复制链接]
戈壁滩上的辉煌 发布时间:2025-5-10 23:38
       我们板子第一次上电的时候看到的就是LED的闪烁实验,而且还可以通过按键来调整闪烁的频率,这个板载demo的效果,两个LED交替闪烁,一般板载的demo都是通过延时的方式实现的。这次我们将通过定时的方式实现两个LED的同频闪烁,通过外部中断的方式采集按键,调整同频闪烁的频率。
       我们先看一下需要使用的硬件资源:
       LED:
1.png

       按键:
2.png

       GPIO的功能专注于具体引脚的实现,涵盖输入与输出两大核心方面。输入功能主要用于采集外部器件的状态信息(例如按键状态),而输出功能则实现对外部器件的有效控制(LED的控制)。本开发板装备了两个LED灯作为可操控的外部器件实例,同时配备一个用户按键,用于输入信号的检测。简单分析一下原理图,LD1事业绿灯,想要点亮需要PA5输出高电平,LD2为蓝灯,要点亮需要PC9输出低电平。按键按下的时候另一端是地,也就是低电平,所以对应PC13引脚的初始状态要为高电平,不过硬件中R34并没有连接,我们需要通过引脚配置内部上拉。
       定时器是MCU的内部模块,通过精准计数进行计时,这就涉及到时钟的配置来计算定时器参数。
       接下来我们基于板卡创建工程:
3.png

       我们先看一下基于STM32Cube的模块配置,由于引脚的多样性,我们可以在引脚上直接操作:
4.png

       接下来配置三个引脚,一个按键,两个LED:
5.png

       配置定时器模块前先看一下时钟配置,并修改为24M,最大支持48M:
6.png

       接下来配置定时器,我们选用的是定时器14,是一个普通定时器,配置的参数也比较少,定时1ms:
7.png

       接下来是中断配置,实际上我们在上面的具体模块配置的时候就可以进行中断配置,也可以统一开启:
8.png

       到这里硬件方面的配置已经基本完成,我们开始软件方面的操作,实际上我们实现的功能也是非常基础了,初始化和定时处理部分都已经添加了:
9.png

       我们创建两个变量:

  1. uint16_t LED_TimeCnt_limit = 0;
  2. uint16_t TimeCnt = 0;
复制代码
      LED的闪烁就是通过判断TimeCnt是否等于或者大于LED_TimeCnt_limit进行LED的状态翻转。
       我们需要做的就是编写对应的回调函数:
  1. void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
  2. {
  3.      if(GPIO_Pin == GPIO_PIN_13)
  4.      {
  5.                 LED_TimeCnt_limit += 500;
  6.                 TimeCnt = 0;
  7.                 if(LED_TimeCnt_limit > 1500 )
  8.                     LED_TimeCnt_limit = 500;
  9.      }
  10. }

  11. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  12. {
  13.   if (htim->Instance == TIM14) {
  14.     HAL_IncTick();
  15.         TimeCnt++;
  16.         if(TimeCnt > LED_TimeCnt_limit)
  17.         {
  18.             HAL_GPIO_TogglePin(LD1_GPIO_Port, LD1_Pin);
  19.             HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
  20.             TimeCnt = 0;
  21.         }
  22.   }
  23. }
复制代码
      这样我们就通过定时器实现的了LED的翻转控制,这个时候我们加入串口的控制,实在是串口和这种多模式的控制太搭了,我们可以通过串口实现同样的翻转控制命令,同时也可以通过串口打印当前状态,我们试一下加入模式变量,因为要实现同步控制,必须按键和串口命令控制的对象是同一个。
       配置串口2模块:
10.png

       实际上在生成工程的的时候这个模块就配置了,估计当成必备选项了,行为这个串口连接的STlink:
11.png

       我们先实现一下printf打印功能,加入一下代码即可:
  1. #if defined(__ICCARM__)
  2. __ATTRIBUTES size_t __write(int, const unsigned char *, size_t);
  3. #endif /* __ICCARM__ */

  4. #if defined(__ICCARM__)
  5. /* New definition from EWARM V9, compatible with EWARM8 */
  6. int iar_fputc(int ch);
  7. #define PUTCHAR_PROTOTYPE int iar_fputc(int ch)
  8. #elif defined ( __CC_ARM ) || defined(__ARMCC_VERSION)
  9. /* ARM Compiler 5/6*/
  10. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  11. #elif defined(__GNUC__)
  12. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  13. #endif /* __ICCARM__ */
复制代码
      然后将printf与串口2关联:
  1. PUTCHAR_PROTOTYPE
  2. {
  3.   /* Place your implementation of fputc here */
  4.   /* e.g. write a character to the USART3 and Loop until the end of transmission */
  5.   HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);

  6.   return ch;
  7. }
复制代码
      这个时候我们就可以用使用printf打印功能了。
       串口的接收依然使用的是回调函数的方式,同时修改按键控制内容:
  1. void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
  2. {
  3.      if(GPIO_Pin == GPIO_PIN_13)
  4.      {
  5.                 LED_Mode++;

  6.                 LED_TimeCnt_limit = 500+500*LED_Mode;
  7.                 TimeCnt = 0;
  8.                 if(LED_TimeCnt_limit > 1500 )
  9.                 {
  10.                     LED_Mode = 0;
  11.                     LED_TimeCnt_limit = 500;
  12.                 }
  13.                 printf("New Mode:    %d\n\r",LED_Mode);
  14.      }
  15. }
  16. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  17. {
  18.     if(huart->Instance==USART2)
  19.   {
  20.             if(UART2_RXData == 0x00||UART2_RXData == 0x01 || UART2_RXData == 0x02)
  21.             {
  22.                 LED_Mode = UART2_RXData;
  23.                 printf("New Mode:    %d\n\r",LED_Mode);
  24.                 LED_TimeCnt_limit = 500+500*LED_Mode;
  25.                 TimeCnt = 0;
  26.             }
  27.             HAL_UART_Receive_IT(&huart2, &UART2_RXData, 1);
  28.   }
  29. }
复制代码
      整体的效果如下,我们将操作过程和串口控制过程通过动图的方式进行展示:
74502b93f6b77b2dc011d0d08f253a74 (1).gif

       整个对应的串口反应:
12.png

















收藏 评论0 发布时间:2025-5-10 23:38

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版