技术标签: stm32 STM32 CUBEMX-hal库学习教程 嵌入式硬件 单片机
STM32CubeIDE(CUBE-MX hal库)----初尝点亮小灯
STM32CubeIDE(CUBE-MX hal库)----按键控制
STM32CubeIDE(CUBE-MX hal库)----串口通信
STM32定时器是一种多功能外设,可以为嵌入式系统提供各种定时和计数功能。通过合理配置,它可以适应各种应用场景,提供精准的定时和计数功能,使嵌入式系统更加灵活和可控。
功能:定时、捕获脉冲、计算PWM占空比、输出PWM波形、编码器计数。
如何进行计数:如果时钟输入频率是72MHZ,则计数器计数到72000000用了一秒钟。但是计数器寄存器的位数16bit只能计数65536/72000000次/秒=0.0009秒。所以需要一个预分频器(顾名思义是将频率进行降低计算公式 频率/(分频数+1)不分频就设为0)也是一个16位的寄存器,可进行65536次分频。则定时器最多可定时65536×65536/72000000=59.65s
设置串口一用于打印调试信息
打开串口中断
将高速外部时钟源设为晶振可以提高定时精度
时钟设置
定时器设置
定时器参数设置,下面的设置实现了1s的定时,如果想要0.5s的定时则将分频系数设为7199,计数值设为4999。计算过程72000000/(7199+1)/(4999+1)=2Hz 赫兹(Hz)是频率的单位,表示每秒的周期数。要将赫兹转换为秒 1/2=0.5s
定时器中断设置
实验一:观察计数器的数值是如何变化的,只需要在已有的代码中加入以下代码头文件包含
/* USER CODE BEGIN Includes */
#include <string.h>
#include <string.h>
/* USER CODE END Includes */
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start(&htim4);
int counter=0;
char message[20];
/* USER CODE END 2 */
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start(&htim4);
int counter=0;
char message[20];
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
counter=__HAL_TIM_GET_COUNTER(&htim4);//获取计数�?
sprintf(message,"counter: %d",counter);
HAL_UART_Transmit_IT(&huart1, (uint8_t *)message, sizeof(message));
HAL_Delay(99);//延时100ms
}
/* USER CODE END 3 */
}
__HAL_TIM_SET_COUNTER 设置计数器的值
__HAL_TIM_GET_COUNTER 获取计数器的值
__HAL_TIM_SET_AUTORELOAD 设置重装载计数器的值
__HAL_TIM_GET_AUTORELOAD 获取重装载计数器的值
__HAL_TIM_SET_PRESCALER 设置预分频器的值
实验现象
实验二:利用定时器中断实现计时功能,通过重写HAL_TIM_PeriodElapsedCallback函数,实现每隔1s触发一次中断,num自增一向串口助手传num的值。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 函数是在使用STM32的HAL(Hardware Abstraction Layer)库时,用于处理定时器(TIM)定时周期到达事件的回调函数。该函数在定时器的中断服务子程序(ISR)中被调用,用于用户定义的处理。
参数 TIM_HandleTypeDef *htim 是一个指向定时器处理结构体的指针,其中包含了有关定时器的信息,如定时器的基地址、计数器值、定时器配置等。
uint8_t num=0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim4){
num++;
HAL_UART_Transmit_IT(&huart1, &num, 1);
}
}
实验现象
定时器初始化
void Timer_Init(void)
{
//开启时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
//选择时基单元的时钟 选择内部时钟 默认使用内部时钟可以不写
TIM_InternalClockConfig(TIM4);
//配置时基单元
TIM_TimeBaseInitTypeDef TimeBaseInitStructure;
TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//时钟分频 不进行分频
TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数方式 向上计数
TimeBaseInitStructure.TIM_Period=10000-1 ; //自动重装载的值
TimeBaseInitStructure.TIM_Prescaler=7200-1;//预分频系数
TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器高级定时器里面才有
TIM_TimeBaseInit(TIM4,&TimeBaseInitStructure);//时基初始化
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);//使能定时器中断
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //从优先级1级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
TIM_Cmd(TIM4,ENABLE);//开启定时器
}
中断服务函数
void EXTI4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET) //检查定时器中断标志位是否置位
{
num++;
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
}
}
hal库和标准库函数对比
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)--------->void EXTI4_IRQHandler(void)(标准库)
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)和TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);功能类似开启定时器中断
。
文章浏览阅读1k次。http://www.csdn.net/article/2015-04-15/2824477-android-performance/1摘要:Google在Udacity上的《Android性能优化》在线课程详细介绍了该如何优化性能,这些课程是Google之前在Youtube上发布的Android性能优化典范专题课程的细化与补充。本文是对渲染、运算、内存、电量四个篇章的学习笔记。_intro and recap timestamps
文章浏览阅读2k次。事务:之前了解到的是,转账(一个帐户上都加、一个帐户上进行减)行级事务(要保存一条insert\update不会出现只插入一部分的情况)实时:查询速度快,响应速度快。在企业里面,一个请求发送出去,如果不是太复杂的话,在做需求的时候,整个响应过程一般不会超过3SOLTP:一般指的是数据库OLAP:重点在于分析上,用于查询或者分析使用。没有实时要求一般是按天、周、月、年来进行数据统计。OLTP是要求实..._hive 使用场景
文章浏览阅读3.4k次,点赞2次,收藏27次。Asp.net核心技术思想 1、概述反射和序列化反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet_asp.net标签必须是小写吗
文章浏览阅读960次。uikit里有一个函数是UIImageWriteToSavedPhotosAlbum可以实现_iphone file文件放入album
文章浏览阅读1.2k次。Arm-A 体系架构安全特性总结:安全特性 英文拼写 说明 应对的攻击 引入的版本 XN execute never 不可执行。一般用于配置数据段不可执行,防止数据段注入可执行的shell code。 使用XN可执行DEP(Data execute Prevention,一般我们通常说的堆栈不可执行) 任意地址读写、代码段覆盖 < v8 PXN Privileged Execute Never 特权模式不可执..._arm sel2技术
文章浏览阅读9.8k次。数据模型(Data Model)是2113数据特征的5261抽象。数据(Data)是描述事物的符号记录,模型(4102Model)是现实世界的抽象。数据1653模型从抽象层次上描述了系统的静态特征、动态行为和约束条件,为数据库系统的信息表示与操作提供了一个抽象的框架。数据模型所描述的内容有三部分:数据结构、数据操作和数据约束。扩展资料:数据模型所描述的内容包括三个部分:数据结构、数据操作、数据约束。1、数据结构:数据模型中的数据结构主要描述数据的类型、内容、性质以及数据间的联系等。数据结构是数据模型_什么是数据模型
文章浏览阅读128次。当从一个表中将记录Copy到另一个结构相同的表中的时候,有两种方式:DataTable.ImportRow()或: DataTable.Rows.Add()正确的使用方法: dt1.ImportRow(dt.Rows[0]);或: dt1.Rows.Add(dt.Rows[0].ItemArray);不要使用:..._add data row
文章浏览阅读1.5w次,点赞4次,收藏55次。文件表达式-e filename 如果 filename存在,则为真-d filename 如果 filename为目录,则为真-f filename 如果 filename为常规文件,则为真-L filename 如果 filename为符号链接,则为真-r filename 如果 filename可读,则为真-w filename 如果 filename可写,则为真-x filename 如果..._-f
文章浏览阅读301次。【代码】【JS】根据日期和给定的天数,计算日期的前几天或者后几天的日期时间。_js计算某个日期多少天后的日期
文章浏览阅读2.4k次,点赞2次,收藏5次。在本系列第一篇中,我们分析了 WebRTC-Android 相机采集的实现,本文中我们将分析预览的实现。有过一定相机开发经验的朋友可能会疑惑,预览还有什么好分析的,不是直接 camera.setPreviewDisplay 或者 camera.setPreviewTexture 就能在 SurfaceView/TextureView上预览了吗?实际上预览还有更高级的玩法,尤其是需要加上图像处理功能..._surfaceviewrenderer
文章浏览阅读2.7k次,点赞28次,收藏88次。tools.hpp源.cpp_easyx制作打牌
文章浏览阅读2.6w次,点赞54次,收藏349次。如何快速学习VR开发,以及HTCvive的使用。_unity vr