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 */
M7 O! t/ M8 A - $ r5 a/ X$ H, ^* ?
- /*周期唤醒中断回调函数 */
' ~1 k; W: h* _4 m- j - void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
6 R% T* u4 W# [7 e4 b - {
1 \$ w2 p6 U1 a) f' s. k$ D - RTC_TimeTypeDef sTime; //用于获取时间
" k4 `0 X0 ]- g/ e8 L G - RTC_DateTypeDef sDate; //用于获取日期! F3 f7 w% A* H7 F
- static uint8_t led_flash_state = 0b100; //定义三个LED灯的状态
w+ M7 I( p: c% G4 n+ t - //读取时间和日期,必须都读出来,否则无法解锁,就不能继续取
. C. y- T. j4 F( u - if(HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BIN) == HAL_OK). `1 k7 l1 P8 c5 h L6 b) F
- {: \ K0 m0 F9 t' r! j
- HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BIN);& C% X4 i# @$ ^* L' {; B( c
- char str[40] ;
+ g1 y w$ H4 f' g, y - sprintf(str, "RTC Date= %4d-%2d-%2d\r\n", 2000+sDate.Year,sDate.Month, sDate.Date);
) {4 ~! S- h" U9 G6 V+ H$ }2 q" ] - HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);
& N6 R* t# S! ? - sprintf(str, "RTC Time= %2d:%2d:%2d\r\n", sTime.Hours,sTime.Minutes, sTime.Seconds);
9 t6 _8 B& N6 f! {# b" y - HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);* Y4 T8 C5 S- Y& k4 D% x0 `
- HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, led_flash_state&0b001); //获取LED1的状态 如果是1,测点亮 如果是0则熄灭
; x: y3 V+ `- s% W- U# d9 T7 v/ U - HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, led_flash_state&0b010); //获取LED2的状态 如果是1,测点亮 如果是0则熄灭
! p4 u! s K( E2 l0 D - HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, led_flash_state&0b100); //获取LED3的状态 如果是1,测点亮 如果是0则熄灭
" s9 B$ C" L/ M2 T* E - led_flash_state = led_flash_state>>1; //右移一位,形成流水灯
# x; C$ J9 c7 s# Q0 ^, f - if (led_flash_state == 0) //如果右移到最后,则复位。
H) u* O3 `( E- X - led_flash_state = 0b100;
$ a' E0 [! `- A" D! A7 m/ b( a - }: L0 r* _+ o' P h
- }
+ d4 f' }6 S' E - * e6 x9 ] F# C4 R
- /* 闹钟A中断的回调函数 */2 r3 I; u. k6 M3 Z& z% u! Q# W
- void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
3 X+ Y, u, Z( E. f! s3 s - {
& K7 ~; P- o+ S |# L - char str[40] ;
. h2 g3 q: ]- W3 \! _! E, o' D - triggerCntA ++;0 @; z% k+ R+ h F/ J8 k+ d, N
- sprintf(str, "TriggerCntA: %d\r\n", triggerCntA);4 C/ i x7 ]( ~* J- M i' ?
- HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000);( `- H% E8 V6 W$ f6 f
/ x* o2 u3 G" r; o$ V3 K* C5 X- }& s- ^* [2 K# J. R! W, M6 {/ b I7 V
- 4 o. z" I; ?6 \/ J4 T3 S3 [
- /* 闹钟中断的回调函数 */! q% b5 C; M/ L7 z/ `0 P; |
- void HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc)
. u( B7 g) o! q# e3 u$ T5 F+ j8 s- ] - {" @+ g- ~" m4 T6 J/ L7 w/ q
- char str[40] ;0 G5 B9 R c3 v2 |
- triggerCntB++;
1 w" ? r ?6 H6 o6 d - sprintf(str, "TriggerCntB: %d\r\n", triggerCntB); D" l+ E) o6 z2 g' C
- HAL_UART_Transmit(&huart3, (uint8_t *)str, strlen(str), 1000); Q$ |# a3 R9 t( f3 L5 R
- 2 B {# ]# u1 z$ | _" F
- }- d% Q6 h, L* P; ?7 d: G) v; @
- /* USER CODE END 0 */
复制代码编译后下载到开发板,板载3个LED灯交替亮起来。串口打印出日期以及每秒的计数,每分钟的第1秒打印闹钟A的中断计数,每分钟的第2秒打印出闹钟B的累计次数: 这样的代码相比于HAL_Delay来实现流水灯,不用占用CPU的运行时间。同时周期性的唤醒,也可以做为低耗等其他的中断唤醒源。
|