目录
一、STM32定时器实例
1、定时器简介
STM32 单片机的定时器分为高级定时器、 通用定时器 、基本定时器三种。这三个定时器成上下级的关系,即基本定时器有的功能通用定时器都有,而且还增加了向下、向上/向下计数器、PWM生成、输出比较、输入捕获等功能。
2、实例
1)、要求
设置一个5秒的定时器,每隔5秒从串口发送“hello windows!”;同时设置一个2秒的定时器,让LED等周期性地闪烁。
2)、STM32CubeMX创建项目
2)、STM32CubeMX设置
引脚设置
A4引脚为GPIO_Output类型,用于连接LED负极,重命名为LED方便后续代码使用 。
RCC设置
SYS设置
USART1设置
配置定时器,这里配置定时器2
配置中断,生成定时器2中断优先级配置代码。
时钟树配置
完成设置
3)、keil项目调试
main函数添加代码
HAL_TIM_Base_Start_IT(&htim2);//启动定时器2
添加定时器回调函数 (可添加在main.c中)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint32_t time_cnt =0;
static uint32_t time_cnt1 =0;
char data[] = "hello windows!\n";
if(htim->Instance == TIM2)
{
if(++time_cnt >= 200)//两秒LED状态反转一次
{
time_cnt =0;
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
}
if(++time_cnt1 >= 500)//每五秒输出hello windows
{
time_cnt1 =0;
HAL_UART_Transmit(&huart1,(uint8_t *)data,15,0xffff);
}
}
}
编译
设置生成hex文件
4)、线路连接
USB转TLL与开发板接线
3v3——3.3v
TXD——A10
RXD——A9
GND——G
开发板接线
A4——二极管负极
3.3——二极管正极
接线效果
5)、烧录
6)、实验效果
二、日历时钟实例
1、RTC介绍
1)、RTC(实时时钟)简介
RTC(实时时钟)是指安装在电子设备或实现其功能的IC(集成电路)上的时钟。当您在数字电路中称其为“时钟”时,您可能会想到周期信号,但在英语中,clock也意味着“时钟”。它还意味着将当前时间保持在北顶的时钟,因此它具有“实时”。
2)、RTC原理
RTC基本上由晶体振荡器和振荡器电路组成。这种晶体单元是石英,具有在施加电压时高速振动的特性。振动频率大约是32.768kHz,月差(一个月偏差多少)在1分钟之内。这种振动被振荡电路转换成时钟信号,时间显示在显示器上。该RTC可以安装在CPU的主板上,也可以安装在外部IC上。
3)、RTC特点
·低功耗
·环境温度变化,频率也很稳定
·晶体振荡器转换的时钟信号在时间上显示的速度与计算机相比非常慢,因此它被设计成不会频繁地写入RTC
2、实例
1)、要求
了解实时时钟RTC的原理。STM32芯片自带RTC,因此不须像其他MCU需外接RTC模块。请编程实现STM32的日历读取、设置和输出。要求:
1)读取RTC初始时间;
2)将RTC时间调整为当前时间,并以 2021年x月x日x分x秒的格式从串口输出(或输出到OLED屏),每1s改变一次;
3)如果输出内容中需加入“星期x”,请修改代码。
2)、STM32cubeMX设置
创建工程(如上一实例)
RCC设置
配置RTC,激活时钟源(Activate Clock Source)和日历(Activate Calendar))
设置初始时间为2016年1月1日10:30
USART1设置(用于串口通信)
时钟树配置
完成配置
3)、keil项目调试
添加代码
在main.c添加结构体
RTC_DateTypeDef GetData; //获取日期结构体
RTC_TimeTypeDef GetTime; //获取时间结构体
在main.c添加foutc函数,使得能够使用printf函数
int fputc(int ch,FILE *f)
{
uint8_t temp[1]={ch};
HAL_UART_Transmit(&huart1,temp,1,2);
return ch;
}
在while函数中添加代码
/* 获取RTC中时间 */
HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
/* 获取RTC中日期 */
HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);
/* 输出年月日 */
printf("%02d/%02d/%02d\r\n",2000+ GetData.Year, GetData.Month, GetData.Date);
/* 输出时间*/
printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);
/*输出星期*/
if(GetData.WeekDay==1){
printf("星期一\r\n");
}else if(GetData.WeekDay==2){
printf("星期二\r\n");
}else if(GetData.WeekDay==3){
printf("星期三\r\n");
}else if(GetData.WeekDay==4){
printf("星期四\r\n");
}else if(GetData.WeekDay==5){
printf("星期五\r\n");
}else if(GetData.WeekDay==6){
printf("星期六\r\n");
}else if(GetData.WeekDay==7){
printf("星期日\r\n");
}
printf("\r\n");
HAL_Delay(1000);
4)、烧录
5)、实验效果
三、总结
本次练习与之前练习的步骤相差不大,主要在代码学习方面有所不同。