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 */, ]5 l3 N) q. u) V
" Z( |$ d! x2 Z, b# Q; i7 s- /*周期唤醒中断回调函数 */
( L/ d( M0 b2 D" [ - void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
; @& }1 T/ f. K" k! w1 X# N) M8 v - {
4 A, R8 A9 q1 h# |& d2 Q - RTC_TimeTypeDef sTime; //用于获取时间: V6 H, e$ H2 y* r+ ?. j
- RTC_DateTypeDef sDate; //用于获取日期& v# T( }8 m9 _9 f$ d9 N5 F
- static uint8_t led_flash_state = 0b100; //定义三个LED灯的状态
7 ~" X# N& a; o; d+ y - //读取时间和日期,必须都读出来,否则无法解锁,就不能继续取3 O- _( r; L8 Z2 R
- if(HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BIN) == HAL_OK)
2 _* _3 c8 Z4 f% K: i - {( S- K3 }! |2 U9 r% [+ s
- HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BIN);2 |2 x9 v# J1 d/ e8 v1 i
- char str[40] ;! d4 Q; _5 r: N: L& `
- sprintf(str, "RTC Date= %4d-%2d-%2d\r\n", 2000+sDate.Year,sDate.Month, sDate.Date);
0 r# I9 r% t3 x0 f2 x$ i - HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);. B- Z% h9 j/ _( i$ S
- sprintf(str, "RTC Time= %2d:%2d:%2d\r\n", sTime.Hours,sTime.Minutes, sTime.Seconds);
& ]- O4 r, T0 T$ i' z$ e - HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);7 _% R& n, d+ k$ d' S6 ]3 M
- HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, led_flash_state&0b001); //获取LED1的状态 如果是1,测点亮 如果是0则熄灭
9 r( y1 \/ C1 f - HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, led_flash_state&0b010); //获取LED2的状态 如果是1,测点亮 如果是0则熄灭& u! G1 J: N% f* v& {0 ?
- HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, led_flash_state&0b100); //获取LED3的状态 如果是1,测点亮 如果是0则熄灭2 X8 K6 X% D0 U& f* M
- led_flash_state = led_flash_state>>1; //右移一位,形成流水灯0 G: ^0 l. | K' a c0 Q. A9 d8 X
- if (led_flash_state == 0) //如果右移到最后,则复位。
) d6 q% a; y1 r0 x1 H - led_flash_state = 0b100;5 j7 E' Y" v% ~
- }+ _( g3 b4 o) W6 |8 G
- }% U7 x) e/ f' T$ I8 h' o
+ X1 e2 ^* V X! P G# F) \- W- /* 闹钟A中断的回调函数 */: {5 V3 F6 T1 Z: e$ t3 L
- void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)4 l n4 j- q* h
- {- ]# m4 w ]6 ?. e8 J
- char str[40] ;
7 F* T# E) I3 t' W% | - triggerCntA ++;% {* H t) H8 n/ e/ l6 ~
- sprintf(str, "TriggerCntA: %d\r\n", triggerCntA);/ D0 e7 {# U, e
- HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);
; Q6 s `9 {& q4 ^% R+ G - ; s% b% z9 r3 _$ I
- }1 z* g0 p1 b$ G; k2 g! t
- 6 ]$ ^1 v. Z: I( e
- /* 闹钟中断的回调函数 */
1 r; r# H' S* P1 @3 r$ ~ - void HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc)
9 Z/ i" o6 w# l* K! c: _ - {2 U% [3 M* N5 w; n* J/ ?' {
- char str[40] ;9 I! m( ? O, L6 w' j
- triggerCntB++;
) S- J$ c! M& A# J - sprintf(str, "TriggerCntB: %d\r\n", triggerCntB);4 V) [' T* w, @" V
- HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);. V( f: J/ v) J- Y+ n% ?# r
- " w; ?* t" L& y
- }4 {) \. ]7 S' w6 k6 Y" b
- /* USER CODE END 0 */
复制代码编译后下载到开发板,板载3个LED灯交替亮起来。串口打印出日期以及每秒的计数,每分钟的第1秒打印闹钟A的中断计数,每分钟的第2秒打印出闹钟B的累计次数: 这样的代码相比于HAL_Delay来实现流水灯,不用占用CPU的运行时间。同时周期性的唤醒,也可以做为低耗等其他的中断唤醒源。
|