第8周-定时器与日历时钟

作业一

要求:1. 之前作业中的延时功能都是通过循环、delay/Hal_delay函数等实现,本次作业通过定时器Timer方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务。请设置一个5秒的定时器,每隔5秒从串口发送“hello windows!”;同时设置一个2秒的定时器,让LED等周期性地闪烁。

一,创建工程

1.打开软件STM32CubeMX,点击"ACCESS TO MCU SELECTOR"来创建一个新工程。
image
2,芯片选择“STM32F103C8T6”

3,配置芯片
(1)打开外部时钟,点击“System Core",选择RCC,在右侧选择”crystal/Ceramic Resonator".
image

(2)在选择调试接口,点击“System Core",选择SYS,在右侧选择“Serial Wire”。
image

(3)配置小灯。点击PA2设置为GPIO_Output。
image
(4)配置定时器2。这里我们使用定时器2来实现定时的功能。如图所示,依次点击位置1,选中定时器2;位置2,配置定时器2的时钟源为内部时钟;位置3,分频系数为71,向上计数模式,计数周期为5000,使能自动重载模式。
image
同理设置TIME3
image
分频系数那里虽然写的是71,但系统处理的时候会自动加上1,所以实际进行的是72分频。由于时钟我们一般会配置为72MHZ,所以72分频后得到1MHZ的时钟。1MHZ的时钟,计数5000次,得到时间5000/1000000=0.005秒。也就是每隔0.005秒定时器2会产生一次定时中断****
(4)配置中断。点击NVIC,勾选TIM2和TIM3的中断。
image
点击Code generation,勾选TIM2的中断优先级
image
(5)在目录Connectivity下点击USART1,将Mode改为异步通信Asynchronous
image
(6)配置完毕后 就是更改文件名字,生成工程文件
image

二,代码设计

1,在main主函数中加入定时器启动代码

	HAL_TIM_Base_Start_IT(&htim2);
	HAL_TIM_Base_Start_IT(&htim3);

image
**2,串口通信 **

uint8_t hello[20]="hello windows!\r\n";

image
(3)重写回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	static uint32_t time_cnt =0;
	static uint32_t time_cnt3 =0;
	if(htim->Instance == TIM2)
	{
		if(++time_cnt >= 100)
		{
			time_cnt =0;
			HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_2);
		}
	}
	if(htim->Instance == TIM3)
	{
		if(++time_cnt3 >= 250)
		{
			time_cnt3 =0;
    HAL_UART_Transmit(&huart1,hello,20,100000);
		}
			
	}
}

image

代码改写完成 ,进行烧录测试

测试

烧录
image
效果
image

作业二

要求:
2. 了解实时时钟RTC的原理。STM32芯片自带RTC,因此不须像其他MCU需外接RTC模块。请编程实现STM32的日历读取、设置和输出。要求:

1)读取RTC初始时间,验证是否为 1970年1月1日零分零秒;

2)将RTC时间调整为当前时间,并以 2021年x月x日x分x秒的格式从串口输出(或输出到OLED屏),每1s改变一次;

3)如果输出内容中需加入“星期x”,请修改代码

RTC讲解

RTC 讲解(请跳转至此博客浏览RTC 的内容及意义)

创建作业项目

1.打开软件STM32CubeMX,点击"ACCESS TO MCU SELECTOR"来创建一个新工程。
image
2,芯片选择“STM32F103C8T6”

3,芯片配置
(1),配置RCC(设置高速外部时钟,使能外部晶振LSE
image

(2),配置RTC(激活时钟源(Activate Clock Source)和日历(Activate Calendar))
image
RTC_OUT: Not RTC_OUT
Tamper: ×
第一个是是否使能 tamper(PC13)引脚上输出校正的秒脉冲时钟,第二个: RTC入侵检测校验功能
RTC校验功能,使能侵入检测功能。RTC时钟经64分频输出到侵入检测引脚TAMPER上
当 TAMPER引脚上的信号从 0变成1或者从 1变成 0(取决于备份控制寄存器BKP_CR的 TPAL位),会产生一个侵入检测事件。侵入检测事件将所有数据备份寄存器内容清除。
也就是第一个是使能tamper(PC13)引脚作为时钟脉冲输出
第二个是使能tamper(PC13)引脚作为入侵检测功能

下面是两个RTC的中断:
RTC全局中断RTC_IRQHandler()
闹钟中断函数RTCAlarm_IRQHandler()

(3),使能串口
image

(4)时钟树配置
image
(5)配置完成,保存项目
image
image

代码设计

在main.c中定义时间和日期的结构体用来获取时间和日期

RTC_DateTypeDef GetData;  //获取日期结构体

RTC_TimeTypeDef GetTime;   //获取时间结构体

image

在main.c文件中重写fputc函数,完成printf函数的重定向

//添加头文件#include "stdio.h"
int fputc(int ch,FILE *f){
 uint8_t temp[1]={ch};
 HAL_UART_Transmit(&huart1,temp,1,2);
 return ch;
}

image

运行代码

效果
image

posted @ 2022-11-09 15:44  qgrwljzy  阅读(75)  评论(0)    收藏  举报