STM32C0是ST具有出色性价比的32位MCU系列,精简成本而不妥协性能: ✦ 经济适用——通过更有吸引力的价位和优化的BOM帮用户降低成本 ✦ 性能可靠——受益于经过验证的STM32的高质量和可靠性 ✦ 生态持续——与STM32G0系列引脚兼容,共享相同的技术平台 1、配置GPIO 根据用户手册: LEDs User LD1: a green user LED is connected to the STM32H7 I/O PB0 (SB39 ON and SB47 OFF) or PA5 (SB47 ON and SB39 OFF) corresponding to the ST Zio D13. User LD2: a yellow user LED is connected to PE1. User LD3: a red user LED is connected to PB14. These user LEDs are on when the I/O is HIGH value, and are off when the I/O is LOW. 配置好PB0、PE1、PB14为输出模式,分别标注为LED1、LED2、LED3。 2、配置串口3,用于打印输出,以便于监控。 查看用户手,开发板板载为USART3接入ST-LINK用于串口转USB,串口TX、RX分别为PD8、PD9。 3、图形化配置如下:波特率等其他按默认就OK。 配置RTC,按下图示配置启用时钟源、日历、闹钟A、B,以及周期唤醒。 再下图设置24小时制、日期、日期格式为BCD码制。同时根据当前设置当前日期以及时间。 下面是设置周期唤醒中断以及闹钟A、B:按下面的设置,会在每一分钟的第1秒产生闹钟中断。 同理按下图配置闹钟B,为每1分钟的第2秒产生中断,然后配置每1秒产生唤醒事件。 配置完后生成工程,进入main.c编写周期唤醒事件回调函数,以及两个闹钟事件。 具体代码如下: - /* USER CODE BEGIN 0 */" s2 g4 G) O* X2 m0 s& |
- ) x: L: t4 R2 `/ B, ^5 H
- /*周期唤醒中断回调函数 */4 x, J- U) s0 f- _% G: |* x
- void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
( \1 p, ]# a3 C! I4 G - {
' ]& @2 X B( X/ V9 ]3 A) h - RTC_TimeTypeDef sTime; //用于获取时间
4 V" W) ^# N9 y - RTC_DateTypeDef sDate; //用于获取日期
e* Q6 L0 x& l% @: k q - static uint8_t led_flash_state = 0b100; //定义三个LED灯的状态
7 r8 a# ^9 f* ?' H3 v8 N& C - //读取时间和日期,必须都读出来,否则无法解锁,就不能继续取
$ J* l m9 d) I3 J* j3 V - if(HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BIN) == HAL_OK)
$ u9 \4 A, ^7 z( G - {
: k) }1 s2 ^* q# z5 Q - HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BIN);! [0 [+ p5 j q E" S+ I; A
- char str[40] ;
, S$ n# U+ @3 v+ G$ M- u, Z6 ?' F - sprintf(str, "RTC Date= %4d-%2d-%2d\r\n", 2000+sDate.Year,sDate.Month, sDate.Date);4 h4 V1 O) Y. P3 b7 @8 n
- HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);9 ?1 p( B- G& n4 M
- sprintf(str, "RTC Time= %2d:%2d:%2d\r\n", sTime.Hours,sTime.Minutes, sTime.Seconds);
7 R z, w J2 m - HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);0 w) B8 {; v; Y' L9 W; A( A
- HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, led_flash_state&0b001); //获取LED1的状态 如果是1,测点亮 如果是0则熄灭. {) `6 p# j: O# ?
- HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, led_flash_state&0b010); //获取LED2的状态 如果是1,测点亮 如果是0则熄灭* ]" H8 h* J- J
- HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, led_flash_state&0b100); //获取LED3的状态 如果是1,测点亮 如果是0则熄灭5 j' V! R/ n% F. c/ o
- led_flash_state = led_flash_state>>1; //右移一位,形成流水灯
3 i7 R4 z$ u$ F - if (led_flash_state == 0) //如果右移到最后,则复位。
% ?* [7 O- T/ U! Q! m1 C - led_flash_state = 0b100;$ V: H- \ x; W7 u7 s
- }
: H- b& v3 ?4 J - }0 N, G9 A1 }$ e3 g+ a" I# B! Y
/ `+ b; }- |6 ?4 B% |0 m- /* 闹钟A中断的回调函数 */ c8 Z- C) W, P/ L
- void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)+ X& ^' v( O% [
- {
- g- E# C' Y. o/ G; n5 ? - char str[40] ;5 g. S; O; _1 i5 S+ I* S
- triggerCntA ++;! [; Q3 ~2 G. s
- sprintf(str, "TriggerCntA: %d\r\n", triggerCntA);! x/ j/ r# E/ x7 P- L8 J8 Z* P" e
- HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);
9 e' A/ A7 E0 P! \+ A
0 B7 R( X% {( I) D% P2 \; t9 {- }
9 S! O _6 Y) i1 l# t Y: a
& O& n# \1 O, i& I8 K2 S- /* 闹钟中断的回调函数 */- a0 R4 h$ \+ T- ]- y5 [' s
- void HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc)
! C0 S1 [# v: X' W6 X0 T - {4 ?7 p+ d3 j6 O; ?( z
- char str[40] ;
' X" c# y$ j: f& D- O- f5 _ - triggerCntB++;
" n& I! C: e- C8 r" I+ I - sprintf(str, "TriggerCntB: %d\r\n", triggerCntB);; ]* u7 ]% |. R/ @% h9 p
- HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);
x1 p9 V' @$ D
( r' O! S( C$ X" I& d1 u+ L- }
. n- b/ ^% r9 t- F& j) }0 N% L - /* USER CODE END 0 */
复制代码编译后下载到开发板,板载3个LED灯交替亮起来。串口打印出日期以及每秒的计数,每分钟的第1秒打印闹钟A的中断计数,每分钟的第2秒打印出闹钟B的累计次数: 这样的代码相比于HAL_Delay来实现流水灯,不用占用CPU的运行时间。同时周期性的唤醒,也可以做为低耗等其他的中断唤醒源。
|