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 */6 G7 j* ]: f; b" \" s7 B
5 T! O* ?) A7 F- /*周期唤醒中断回调函数 */
8 }1 c0 `) \. D3 ^$ S0 F) [ - void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)6 u+ S* B& d q- E0 i
- {
' k/ d# K0 l- i+ z. g. n - RTC_TimeTypeDef sTime; //用于获取时间
1 t% G+ |5 Y$ P( @7 A8 \ - RTC_DateTypeDef sDate; //用于获取日期+ N) o' d2 g1 }3 F7 H
- static uint8_t led_flash_state = 0b100; //定义三个LED灯的状态
4 y6 Y+ x B/ ?! S" p2 ` - //读取时间和日期,必须都读出来,否则无法解锁,就不能继续取
3 l! E* }! P2 Q6 n+ O - if(HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BIN) == HAL_OK)- s+ E" n# k3 Q
- {
9 }/ \! ]# O5 D( K; h - HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BIN);
, ~5 s! x0 ?! p9 k) n1 n# @- T | - char str[40] ;" A5 `: @- `4 q3 g% z
- sprintf(str, "RTC Date= %4d-%2d-%2d\r\n", 2000+sDate.Year,sDate.Month, sDate.Date);
+ S# [! b0 z# c# G$ s - HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);% f6 W' f5 J/ U, g$ ?: r; ?; v! @
- sprintf(str, "RTC Time= %2d:%2d:%2d\r\n", sTime.Hours,sTime.Minutes, sTime.Seconds);
+ ^' a3 |! k/ {3 F5 c6 n - HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);
% E% z# r0 H3 B. p* F0 m - HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, led_flash_state&0b001); //获取LED1的状态 如果是1,测点亮 如果是0则熄灭
) g2 X5 p+ S* [7 A - HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, led_flash_state&0b010); //获取LED2的状态 如果是1,测点亮 如果是0则熄灭
) P5 q" x/ O9 F* y9 B - HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, led_flash_state&0b100); //获取LED3的状态 如果是1,测点亮 如果是0则熄灭
3 K' l( r# l0 k. z# @7 l - led_flash_state = led_flash_state>>1; //右移一位,形成流水灯8 G" W$ l% V9 T& {7 \* }
- if (led_flash_state == 0) //如果右移到最后,则复位。( b% h4 g; u! K) b# w
- led_flash_state = 0b100;
4 q% m1 t3 {8 i7 M6 D8 r) l% Y* N; C - }# {# T% U: @' {1 m2 k
- }
6 D X. l5 r+ S' r4 R8 y - * {! \) t$ J1 f6 f* |1 N- n
- /* 闹钟A中断的回调函数 */
% p1 U; ~5 y3 k - void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)2 P* i, C7 \$ B: ^: F/ W$ e9 b- |1 H
- {; `$ F+ L" @+ \4 O5 e7 a
- char str[40] ;
3 t( w# f/ O4 p9 \ - triggerCntA ++;( C' e: x0 `/ C% S3 _8 R8 w
- sprintf(str, "TriggerCntA: %d\r\n", triggerCntA); w$ r, N3 V8 c* ^2 c% I- G& l `" N
- HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);- e: p' d) B3 g& M+ _# d
- 4 u1 ~8 g8 i6 p X
- }; V- j, e. z% m7 m$ D2 d! ~ n
$ ?. l/ J' E, n* @- /* 闹钟中断的回调函数 */. Q. B' w9 g& Y
- void HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc)) l/ g9 J/ [& B7 n+ z/ B% J1 ^3 R0 O
- {2 P* b: k. K/ K$ X
- char str[40] ;
1 R1 x- z0 h0 C" o' R' k - triggerCntB++;
" g+ d' e) V8 e+ H- x, \ - sprintf(str, "TriggerCntB: %d\r\n", triggerCntB);+ M) R7 R& K/ C9 |8 B; w
- HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);
# d& d+ z0 L/ Y6 b0 M
+ a. n. S! U8 J5 G- }6 g# s' J9 g5 d c7 M( S2 }
- /* USER CODE END 0 */
复制代码编译后下载到开发板,板载3个LED灯交替亮起来。串口打印出日期以及每秒的计数,每分钟的第1秒打印闹钟A的中断计数,每分钟的第2秒打印出闹钟B的累计次数: 这样的代码相比于HAL_Delay来实现流水灯,不用占用CPU的运行时间。同时周期性的唤醒,也可以做为低耗等其他的中断唤醒源。
|