|
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 */$ K# w2 c$ b$ t+ v+ S
+ H7 x! Y5 x: E+ f* s- /*周期唤醒中断回调函数 */
+ { {* e) [ B* b - void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)! y5 c5 i1 `. k2 h. h
- {2 |* z7 |! M; B Q E+ E: `. e
- RTC_TimeTypeDef sTime; //用于获取时间
3 t" ` \8 \, `% `7 X# K" A6 o6 Q - RTC_DateTypeDef sDate; //用于获取日期) c* f! ^9 \( C5 k2 [9 ^
- static uint8_t led_flash_state = 0b100; //定义三个LED灯的状态# J1 x: `# M9 d6 b. _* ]4 D
- //读取时间和日期,必须都读出来,否则无法解锁,就不能继续取/ x! e# a5 [/ i) l; ?5 }+ n
- if(HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BIN) == HAL_OK)
/ h) P% v8 x) R, ]0 T - {
7 [% M1 u6 |' t; h0 j. y$ ]' |2 b - HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BIN);
' I( L _3 s: ]8 N) Z4 Q - char str[40] ;9 `& y* t% v4 o" A! ^" G
- sprintf(str, "RTC Date= %4d-%2d-%2d\r\n", 2000+sDate.Year,sDate.Month, sDate.Date);1 i# H( i5 B- [
- HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);6 }1 R$ t, {; S
- sprintf(str, "RTC Time= %2d:%2d:%2d\r\n", sTime.Hours,sTime.Minutes, sTime.Seconds);
5 \/ g' k$ n3 o/ O( `) b1 e; _ - HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);+ Z9 J& m) p( a" B# B3 G
- HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, led_flash_state&0b001); //获取LED1的状态 如果是1,测点亮 如果是0则熄灭) L, M/ {1 j8 M7 ~5 }; Y4 H
- HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, led_flash_state&0b010); //获取LED2的状态 如果是1,测点亮 如果是0则熄灭6 I# v' P1 A# Y" d u
- HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, led_flash_state&0b100); //获取LED3的状态 如果是1,测点亮 如果是0则熄灭
* W- Z. k. V# L$ A - led_flash_state = led_flash_state>>1; //右移一位,形成流水灯
$ g* C s2 `7 U, q) m- X - if (led_flash_state == 0) //如果右移到最后,则复位。
. h; m/ r; y. b+ E) E8 z1 i - led_flash_state = 0b100;
& U. g5 b6 ^) P/ `$ ?* a/ W8 N2 u - }
& c) F' z( V" M2 R - }. ?) s" X2 R9 a0 ]/ N# n- n
5 X G- h! t! d6 i- /* 闹钟A中断的回调函数 */( s9 t( k5 i% H) @
- void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
! Y) g6 }) i+ M5 H4 H - {' `) L& k/ F" d: j3 R
- char str[40] ;* n: d' T( A8 P1 {) ^" O! _
- triggerCntA ++;
B1 i& u; S9 q! _- t; u - sprintf(str, "TriggerCntA: %d\r\n", triggerCntA);
" L) Q6 @3 n; K4 `) Y2 N N - HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);3 I1 N1 ]" Q8 r1 b1 V3 y, p
6 }( c: K3 y2 Q6 W. A! Z1 M) P; g% `- }
+ R3 y4 D$ v6 o% ~2 g0 E - . m8 C) {, g% x; ~) T
- /* 闹钟中断的回调函数 */
2 M! ~9 p$ A' T, r' I4 B; b - void HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc)
. Q, ~" Q, _' R+ b J; ?& T - {
' a7 F+ y. {- P8 Z- k - char str[40] ;+ l- y% t4 D) Y7 @5 d
- triggerCntB++;: R9 p E {3 K$ T
- sprintf(str, "TriggerCntB: %d\r\n", triggerCntB);* a1 x+ c8 E* g+ R( w
- HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);8 E" e& Y- d$ R# C+ @" ^: s0 |
- % n) W4 l/ }3 O
- }
+ Z: K7 |9 E7 ~ z' ]2 a - /* USER CODE END 0 */
复制代码编译后下载到开发板,板载3个LED灯交替亮起来。串口打印出日期以及每秒的计数,每分钟的第1秒打印闹钟A的中断计数,每分钟的第2秒打印出闹钟B的累计次数: 这样的代码相比于HAL_Delay来实现流水灯,不用占用CPU的运行时间。同时周期性的唤醒,也可以做为低耗等其他的中断唤醒源。
|