STM32库函数操作和寄存器操作

合集下载

STM32 LL 库使用指南说明书

STM32 LL 库使用指南说明书

STM32 LL库使用指南---By Fengzi熟悉STM32的都知道ST官方提供了非常方便好用的库函数供用户使用,多数人都使用过STM32标准外设库,STM32Cube库(即HAL库),这个LL库是什么鬼,却从来没听说过。

好吧,我承认这个名字是我自己XJB取的。

目录一、初识LL 库 (1)二、怎么使用LL库 (3)三、新建STM32LL库工程模板 (5)四、第一个程序——点亮LED (8)五、添加其他程序功能 (10)………………………………………………………………………………………………………………………………………………….一、初识LL 库最近论坛发的STM32L476RG Nucleo开发板到手了,准备学习玩耍,当然第一步就是下载资料,于是我下载STM32L4Cube 1.1.0版本,打开逐个查看,好像和以前一样的,没什么特别嘛,于是准备开始开发。

等等,好像还真发现了有点不一样:熟悉HAL库的都知道,该库的文件几乎都是以stm32xxx_hal_xxx.h/.c命名的,为了和以前的标准库有个区分,上图中那些是什么鬼前辈说,遇到问题赶紧查手册,于是我果断打开STM32L4Cube库的说明手册(UM1884):原来这个东西叫做Low Layer APIs,作为英文渣渣表示实在不习惯洋里洋气的高大上名字,于是擅自把他叫做【STM32LL库】了(不服的你咬我啊)。

从这里看好像是说这个东东比HAL库更接近硬件,到底什么鬼,还不清楚。

但是以前好像没见过这个东西啊,就算是STM32L4Cube的1.0.0版本中都没有。

看看Cube发行历史:原来LL库是在1.1.0版本才加上的,大概意思就是:1.LL APIs是寄存器级的编程,嗯,也就是说我们常说的直接操作寄存器吧。

2.LL APIs适用于xxx等一大堆外设3.LL APIs函数全部定义为static inline函数,放在对应的头文件中,用户使用需要包含相关头文件4.参考这两个文档看看LL库文件在Cube库中的位置,有20多个文件,全部以stm32l4xx_ll_xxx.h命名:STM32Cube_FW_L4_V1.1.0\Drivers\STM32L4xx_HAL_Driver\IncSTM32L4是面向低功耗市场的,同时不失高性能,功耗和性能往往是两个矛盾的东西,ST在硬件设计上想了各种办法来实现兼顾低功耗高性能(例如各种低功耗模式,LP外设等),而在软件层面,程序也讲求效率,LL库全是直接操作寄存器,直接操作寄存器往往效率较高,而且函数定义为内联函数,调用函数时不是堆栈调用,而是直接把函数的代码嵌入到调用的地方,利于提高代码相率,我想这也是ST在STM32L4系列中推出这个直接操作寄存器的LL库的原因之一吧。

STM32使用BSRR和BRR寄存器快速操作

STM32使用BSRR和BRR寄存器快速操作

STM32使用BSRR和BRR寄存器快速操作GPI0端口STM32的每个GPIO端口都有两个特别的寄存器,GPIOx_BSR和GPIOx_BRF寄存器,通过这两个寄存器可以直接对对应的GPIOx端口置“或置“ 0。

“GPIOx_BSRR勺高16位中每一位对应端口x的每个位,对高16位中的某位置“狈『端口x的对应位被清“0;“寄存器中的位置“0, “则对它对应的位不起作用。

GPIOx_BSRR的氐16位中每一位也对应端口x的每个位,对低16位中的某位置“1则“它对应的端口位被置“1;“寄存器中的位置“0,“则对它对应的端口不起作用。

简单地说GPIOx_BSR的高16位称作清除寄存器,而GPIOx_BSR的低氐16 位称作设置寄存器。

另一个寄存器GPIOx_BRfl只有低16位有用,与GPIOx_BSR 的高16位具有相同功能。

举个例子说明如何使用这两个寄存器和所体现的优势。

例如GPIOE的16个IO都被设置成输出,而每次操作仅需要改变低8位的数据而保持高8位不变,假设新的8 位数据在变量Newdata 中,这个要求可以通过操作这两个寄存器实现,STM32的固件库中有两个函数GPIO_SetBits和GPIO_ResetBits使用了这两个寄存器操作端口。

上述要求可以这样实现:GPI0_SetBits(GPI0E, Newdata & 0xff);GPI0_ResetBits(GPI0E, (~Newdata & 0xff));也可以直接操作这两个寄存器:GPI0E->BSRR = Newdata & 0xff;GPI0E->BRR = ~Newdata & 0xff;当然还可以一次完成对8位的操作:GPIOE->BSRR = (Newdata & 0xff) | (~Newdata & 0xff)<<16;从最后这个操作可以看出使用BSRR寄存器,可以实现8个端口位的同时修改操作。

STM32UART详细使用说明整理

STM32UART详细使用说明整理

STM32UART详细使用说明整理1.引脚和时钟配置:首先,需要配置UART的引脚和时钟。

在STM32的引脚复用配置中选择UART功能,并配置GPIO的工作模式和引脚配置,使其与UART通信引脚相对应。

然后,配置UART的时钟源和时钟分频系数。

时钟源可以选择为系统时钟或外部时钟源。

2.初始化和配置:使用STM32提供的库函数,初始化UART控制寄存器。

配置波特率、数据位数、停止位数、奇偶校验位以及流控制等参数。

可以使用HAL库函数来完成配置,例如:```c/*初始化UART控制寄存器*/UART_HandleTypeDef huart;huart.Instance = USARTx;huart.Init.WordLength = UART_WORDLENGTH_8B;huart.Init.StopBits = UART_STOPBITS_1;huart.Init.Parity = UART_PARITY_NONE;huart.Init.Mode = UART_MODE_TX_RX;huart.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart.Init.OverSampling = UART_OVERSAMPLING_16;HAL_UART_Init(&huart);```3.数据发送:使用HAL库函数发送数据。

可以选择使用轮询方式还是中断方式发送数据。

轮询方式:```cuint8_t data[] = "Hello, World!";HAL_UART_Transmit(&huart, data, sizeof(data), HAL_MAX_DELAY);```中断方式:```cuint8_t data[] = "Hello, World!";HAL_UART_Transmit_IT(&huart, data, sizeof(data));```需要在发送数据之前开启UART的发送中断,并处理发送完成中断回调函数。

stm32寄存器写法

stm32寄存器写法

STM32是一种常见的微控制器,其寄存器地址和功能由其ARM Cortex-M内核定义。

下面是一些常见的STM32寄存器操作的方法:
1.直接操作寄存器:这种方法需要直接操作特定的寄存器地址,例如:
__asm("MOV R0, #0"); // 将值0写入寄存器R0
2.使用标准C库函数:STM32提供了许多标准C库函数,可以方便地操作寄
存器,例如:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 将GPIOA的第0位设置为低电平
3.使用HAL库函数:STM32 HAL库提供了一组函数,可以方便地操作寄存
器,例如:
HAL_Delay(1000); // 延时1000毫秒
4.使用标准外设库函数:STM32标准外设库函数可以方便地操作寄存器,例
如:
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA的第0位为输出模式
以上是一些常见的STM32寄存器操作方法,具体使用哪种方法取决于具体的项目需求和开发环境。

stm32hal库函数说明手册

stm32hal库函数说明手册

stm32hal库函数说明手册摘要:I.简介A.什么是STM32HAL 库函数?B.为什么需要STM32HAL 库函数?II.STM32HAL 库函数的使用A.库函数的分类1.通用库函数2.外设库函数B.库函数的使用方法1.函数原型2.函数参数3.函数返回值III.STM32HAL 库函数的应用A.实例:GPIO 操作1.HAL_GPIO_Init() 函数2.HAL_GPIO_WritePin() 函数3.HAL_GPIO_ReadPin() 函数B.实例:中断处理1.HAL_GPIO_EXTI_IRQHandler() 函数IV.总结A.STM32HAL 库函数的作用B.STM32HAL 库函数的发展趋势正文:STM32HAL 库函数说明手册I.简介A.什么是STM32HAL 库函数?STM32HAL 库函数是一系列针对STM32 微控制器的函数,它提供了丰富的功能,包括GPIO 操作、中断处理、定时器控制等,方便开发人员快速、高效地开发STM32 应用。

B.为什么需要STM32HAL 库函数?随着STM32 微控制器的广泛应用,开发者需要一套简洁、易用的API 来操作外设,提高开发效率。

STM32HAL 库函数正是基于此需求而设计的。

II.STM32HAL 库函数的使用A.库函数的分类STM32HAL 库函数主要分为两类:通用库函数和外设库函数。

1.通用库函数通用库函数主要包括内存操作、数学运算、字符串处理等基本功能。

2.外设库函数外设库函数则是针对特定外设的函数,例如GPIO、USART、SPI 等。

B.库函数的使用方法1.函数原型STM32HAL 库函数的原型通常以HAL_开头的宏定义形式存在,例如HAL_GPIO_Init()。

2.函数参数每个函数都有其特定的参数,参数类型包括寄存器、指针、整数等。

使用时需要严格按照函数声明中的参数列表进行传递。

3.函数返回值大部分STM32HAL 库函数的返回值都是一个状态码,表示函数执行的结果。

stm32标准库函数手册

stm32标准库函数手册

stm32标准库函数手册STM32标准库函数是一种由ST公司推出的一套用于STM32微控制器编程的开发工具,它能够帮助开发者快速地进行芯片的开发、调试和测试。

本文将对STM32标准库函数进行详细的介绍,并提供中文手册,帮助开发者更好地掌握这个工具。

一、STM32标准库函数概述STM32标准库函数是一套由ST公司提供的软件库,包括了一系列用于STM32微控制器的常用功能函数,例如GPIO、USART、SPI、I2C等,这些函数可以用于快速实现各种应用。

同时,ST公司也提供了一些示例代码,可以方便开发者进行学习和参考。

STM32标准库函数可以与各种不同的开发环境集成,例如Keil、IAR、STM32Cube等,方便开发者进行开发。

在使用STM32标准库函数时,可以通过库函数的方式来调用硬件资源,比如设置GPIO口的状态、使用USART进行通信、配置外部中断等。

1. 系统初始化函数:这些函数包括了芯片系统时钟的初始化、中断优先级的设置、时钟输出的配置等,必须在主函数前进行调用。

2. GPIO和外部中断函数:这些函数用于对GPIO口状态的配置和读取,以及对外部中断的控制。

3. USART函数:这些函数用于对串口进行配置和读写操作。

8. DAC函数:这些函数用于对模拟量进行输出。

以下是STM32标准库函数的中文手册,包含了常用函数的介绍和使用方法。

1. 系统初始化函数1.1. RCC配置函数函数原型:void RCC_Configuration(void)函数功能:配置STM32的时钟源和时钟分频系数。

函数说明:在函数内部,首先对PLL时钟源进行配置,然后根据系统时钟的需要选择PLL时钟的分频系数,然后对AHB、APB1、APB2的分频系数进行配置。

最后,开启相应时钟使能位。

函数功能:对STM32的中断向量表进行重定位,并设置各个中断的优先级。

函数说明:中断向量表的地址是由SCB_VTOR寄存器来控制的。

stm32独立看门狗操作寄存器 库函数

stm32独立看门狗操作寄存器 库函数

stm32 独立看门狗[操作寄存器+库函数]以单片机为核心的微型计算机系统中,单片机经常会受到来自外界电磁场的干扰。

造成程序跑飞,只是程序的正常运行状态被打断而进入死循环,从而使单片机控制的系统无法正常工作。

看门狗就是一种专门用于检测单片机程序运行状态的硬件结构。

stm32也是如此。

stm32 的独立看门狗由内部专门的40Khz低速时钟驱动,即使主时钟发生故障时,它也仍然有效。

这里需要注意的是独立看门狗的时钟是一个内部时钟,所以不是准确的40Khz,而是在30~60Khz之间的一个可变化的时钟,看门狗的时钟对时间的要求不是很精确,所以时钟有偏差可以接受。

本例直接操作寄存器实现验证独立看门狗的复位功能,设定一个800ms的喂狗时间,在主函数中实现LED闪烁,如果设定一个1s的延时,则触发独立看门狗复位,LED常亮。

库函数实现当外部中断发生(按下PA0按键),长时间不喂狗,引发独立看门狗复位时,向外用串口输出复位提示。

直接操作寄存器使用独立看门狗,需要了解一下寄存器:键值寄存器:(IWDG_KR)低16位有效的寄存器,只写寄存器,读出值恒为0x0000. 软件必须以一定的间隔写入0xAAAA,否则,当计数器为0时,看门狗会产生复位。

写入0x5555表示允许访问IWDG_PR和IWDG_RLR寄存器。

写入0xCCCC,启动看门狗工作。

预分频寄存器:(IWDG_PR)第三位有效寄存器,用于设置看门狗的分频系数,最低为4,最高位256.通过设置PR[2:0]:位来选择计数器时钟的预分频因子。

要改变预分频因子,IWDG_SR寄存器的PVU位必须为0。

000: 预分频因子=4100: 预分频因子=64001: 预分频因子=8101: 预分频因子=128010: 预分频因子=16110: 预分频因子=256011: 预分频因子=32111: 预分频因子=256重装载寄存器:(IWDG_RLR)低12位有效,RL[11:0]。

STM32库函数汇总

STM32库函数汇总

STM32库函数汇总1.GPIO初始化函数 第1个参数设置GPIO端⼝,第⼆个为结构体设置模式 GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 2.读取输⼊电平函数 uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 读取某个GPIO输⼊的电平,实际操作IDR寄存器,有返回值 uint8_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); 读取⼀组GPIO输⼊的电平,实际操作IDR寄存,有返回值3.读取输出电平函数 uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 读取某个GPIO输出的电平,实际操作ODR寄存器,有返回值 uint8_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);读取某组GPIO输出的电平,实际操作ODR寄存器,有返回值4.设置输出电平函数 GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 设置⾼电平实际操作,BSRR寄存器 GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 设置低电平,实际操作BRR寄存器5.使能时钟函数 RCC_APB2PeriphColckCmd();6.开启重映射时钟 GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);参数1可以是串⼝,SWJ等很多种类型7.设置中断优先级分组 void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); 在misc.c⽂件中8.设置抢占优先级和响应优先级 void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);需要设置通道,抢占优先级,响应优先级,使能通道等9.串⼝相关函数 void USART_Init();串⼝初始化:波特率,数据字长,奇偶校验,硬件流控以收发使能 void USART_Cmd(形参1,形参2);使能串⼝,形参1是串⼝位,形参2是ENABLE; void USART_ITConfig(形参1,形参2,形参3);使能中断,形参1是串⼝位,形参2是要开启中断的类型,形参3是ENABLE; void USART_SendData(形参1,形参2);发送数据到串⼝,DR,形参1是串⼝位,形参2是要发送是数据 uint16_t USART_ReceiveData(形参1);接收数据,从DR读取接收到的数据,形参1值是串⼝位 FlagStatus USART_GetFlagStatus();获取状态标志位 void USART_ClearFlag();清除状态标志位 ITStatus USART_GetITStatus(形参1,形参2)获取中断标志位;参数1值是串⼝位,参数2是要获取的状态 void USART_ClearITPendingBit();清除中断状态标志位 USART1_IRQHandler();USART中断函数,产⽣中断后进⼊,函数在核⼼⽂件中;10.外部中断函数 GPIO_EXTILineConfig(参数1,参数2);设置中断线的映射关系,参数1与参数2为要中断的IO EXTI_Init();初始化外部中断线,触发⽅式, EXTI_GetITStatus();判断中断状态是否发⽣ EXTI_ClearlTPendingBit();清除中断线上的标志位11.独⽴看门狗实验 IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);形参后⾯跟ENABLE,取消写保护 IWDG_SetPrescaler(uint8_t IWDG_Prescaler);设置预分频系数 IWDG_SetReload(uint16_t Reload);设置重装载值 IWDG_Enable();使能看门狗 IWDG_ReloadCounter();喂狗12.窗⼝看门狗 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);使能窗⼝看门狗 WWDG_SetPrescaler();设置预分频系数 WWDG_SetWindowValue();设置上窗⼝值  WWDG_EnableIT(); 开启窗⼝看门狗中断 NVIC_Init();中断初始化 WWDG_Enable();使能看门狗,设置初始计数器值 WWDG_SetCounter();喂狗 设置计数器值 WWDG_IRQHandler();编写中断服务函数13.通⽤定时器 TIM_TimeBaseInit(TIM3, &TIM_Timesture); 初始化通⽤定时器 TIM_GetITStatus(TIM3,TIM_IT_Update); 获取定时器标志位发⽣中断后标志位置1 SET TIM_ClearITPendingBit(TIM3,TIM_IT_Update);清除定时器标志位 TIM_ITConfig(TIM3, TIM_IT_Update,ENABLE);开启定时器中断 TIM_Cmd(TIM3, ENABLE); 使能通⽤定时器。

stm32hal库函数说明手册

stm32hal库函数说明手册

stm32hal库函数说明手册摘要:一、STM32HAL 库概述二、STM32HAL 库常用函数说明1.GPIO 操作相关函数2.备份寄存器相关函数3.CAN 控制器相关函数4.局域网模块相关函数5.DMA 直接内存存取控制器相关函数6.外部中断事件控制器相关函数7.闪存存储器相关函数8.通用输入输出相关函数9.内部集成电路相关函数10.独立看门狗相关函数11.嵌套中断向量列表控制器相关函数12.电源/功耗控制相关函数13.复位与时钟控制器相关函数正文:一、STM32HAL 库概述STM32HAL 库是基于STM32 微控制器的硬件抽象层(HAL)库,它为开发者提供了一系列易于使用的函数,以便在STM32 上实现各种外设的操作。

STM32HAL 库大大简化了开发过程,降低了开发难度,使得开发者能够更加高效地开发出功能丰富的应用程序。

本手册主要对STM32HAL 库中的常用函数进行说明,帮助开发者快速掌握库函数的使用方法。

二、STM32HAL 库常用函数说明1.GPIO 操作相关函数GPIO(通用输入输出)是STM32 微控制器中最常用的外设之一。

以下是一些常用的GPIO 操作函数:- halgpiodeinit:GPIO 初始化函数,用于配置GPIO 的引脚模式、输出类型、速度等。

- halgpiowrite:用于设置或清除指定GPIO 引脚的状态。

- halgpioread:用于读取指定GPIO 引脚的状态。

- halgpioexticallback:中断回调函数,用于处理GPIO 外部中断事件。

2.备份寄存器相关函数备份寄存器用于在系统复位或断电时保存一些关键数据。

以下是一些常用的备份寄存器操作函数:- hal_bkp_init:备份寄存器初始化函数。

- hal_bkp_write:向备份寄存器写入数据。

- hal_bkp_read:从备份寄存器读取数据。

3.CAN 控制器相关函数CAN(控制器局域网)是一种常用于车辆和工业控制领域的通信协议。

STM32寄存器操作举例

STM32寄存器操作举例

那么很明显,只可能是 GPIOx_CRL GPIOx_CRH , GPIOx_ODR 三个寄存器会有想要 仔细阅读这几个寄存器的介绍后知道,GPIOx_CRL 是控制 PIN 0-7 的属性的,GPIOx_CRH 控制 PIN 8-15, ODR 寄存器 当然就是输出数据了,将数据送到这里就行了。
然后,这几个寄存器的地址是多少?首先看 stm32f103ve.pdf 这个是官方的 datasheet、,看第四章, Mmeory Mapping 为什么看这章?会英文都能猜到吧?,看 PORTB 的地址是 0x40010C00 - 0x40010FFF ,这个就是基地 址了。基地址 加上偏移量就能找到具体的寄存器。
typedef struct {
__IO uint32_t CRL; __IO uint32_t CRH; __IO uint32_t IDR; __IO uint32_t ODR; __IO uint32_t BSRR; __IO uint32_t BRR; __IO uint32_t LCKR; } GPIO_TypeDef;
以结构体指针的形式传递 IO 口 GPIO_TypeDef* GPIOx
访问 CRL 寄存器则用成员的形式 GPIOx->CRL;
不需要担心这样做的效率,因为都是地址,也就是指针,最终的效率是直接寄存器操作,效率是非常高的。
看不懂库函数,归根究底就是 C 语言功底不行。不要以为写过几行 51 就懂 C 语言了,远的很呢。
} } 如果将寄存器做一个定义,则程序变成如下
#define RCC_APB2ENR *(volatile unsigned long *)0x40021018 #define GPIOB_CRL *(volatile unsigned long *)0x40010C00 #define GPIOB_ODR *(volatile unsigned long *)0x40010C0C

STM32使用BSRR和BRR寄存器快速操作

STM32使用BSRR和BRR寄存器快速操作

STM32使用BSRR和BRR寄存器快速操作GPIO端口STM32的每个GPIO端口都有两个特别的寄存器,GPIOx_BSRR和GPIOx_BRR寄存器,通过这两个寄存器可以直接对对应的GPIOx端口置“1“或置“0“。

GPIOx_BSRR的高16位中每一位对应端口x的每个位,对高16位中的某位置“1“则端口x的对应位被清“0“;寄存器中的位置“0“,则对它对应的位不起作用。

GPIOx_BSRR的低16位中每一位也对应端口x的每个位,对低16位中的某位置“1“则它对应的端口位被置“1“;寄存器中的位置“0“,则对它对应的端口不起作用。

简单地说GPIOx_BSRR的高16位称作清除寄存器,而GPIOx_BSRR的低16位称作设置寄存器。

另一个寄存器GPIOx_BRR只有低16位有用,与GPIOx_BSRR的高16位具有相同功能。

举个例子说明如何使用这两个寄存器和所体现的优势。

例如GPIOE的16个IO都被设置成输出,而每次操作仅需要改变低8位的数据而保持高8位不变,假设新的8位数据在变量Newdata中,这个要求可以通过操作这两个寄存器实现,STM32的固件库中有两个函数GPIO_SetBits()和GPIO_ResetBits()使用了这两个寄存器操作端口。

上述要求可以这样实现:GPIO_SetBits(GPIOE, Newdata & 0xff);GPIO_ResetBits(GPIOE, (~Newdata & 0xff));也可以直接操作这两个寄存器:GPIOE->BSRR = Newdata & 0xff;GPIOE->BRR = ~Newdata & 0xff;当然还可以一次完成对8位的操作:GPIOE->BSRR = (Newdata & 0xff) | (~Newdata & 0xff)<<16;从最后这个操作可以看出使用BSRR寄存器,可以实现8个端口位的同时修改操作。

STM32库函数底层操作解析

STM32库函数底层操作解析
这同样是一个枚举类型同义字,其成员有 GPIO_Mode_AIN、GPIO_Mode_AF_OD 等(也可以 轻易判断出这表示 GPIO 设备的工作模式)。
至此对程序段一的①解析可以做一个总结:该行定义一个结构体类型的变 量 GPIO_InitStructure , 并 且 该 结 构 体 有 3 个 成 员 , 分 别 为 GPIO_Pin 、 GPIO_Speed 和 GPIO_Mode,并且 GPIO_Pin 表示 GPIO 设备引脚 GPIO_Speed 表示 GPIO 设备速率和 GPIO_Mode 表示 GPIO 设备工作模式。
STM32 库函数底层操作解析
意法半导体在推出 STM32 微控制器之初,也同时提供了一套完整细致的固件开发包,里面包含 了在 STM32 开发过程中所涉及到的所有底层操作。通过在程序开发中引入这样的固件开发包,可以 使开发人员从复杂冗余的底层寄存器操作中解放出来,将精力专注应用程序的开发上,这便是 ST 推出这样一个开发包的初衷。
/* 读出当前配置字 */ tmpreg = GPIOx->CRL; for (pinpos = 0x00; pinpos < 0x08; pinpos++) {
/* 获取将要配置的引脚号 */ pos = ((u32)0x01) << pinpos; currentpin = (GPIO_InitStruct->GPIO_Pin) & pos; if (currentpin == pos) {
assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed)); currentmode |= (u32)GPIO_InitStruct->GPIO_Speed; }

stm32库函数详解

stm32库函数详解
名为 PPP_ClearFlag 的函数,其功能为清除外设 PPP 标志位,例如:I2C_ClearFlag.
名为 PPP_GetITStatus 的函数,其功能为判断来自外设 PPP 的中断发生与否,例如:I2C_GetITStatus.
名 为 PPP_ClearITPendingBit 的 函 数 , 其 功 能 为 清 除 外 设 PPP 中 断 待 处 理 标 志 位 , 例 如 : I2C_ClearITPendingBit.
4 函数 GPIO_StructInit
功能描述:把 GPIO_InitStruct 中的每一个参数按缺省值填入 例: GPIO_InitTypeDef GPIO_InitStructure; GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStruct: GPIO_Pin:GPIO_Pin_All GPIO_Speed:GPIO_Speed_2MHz GPIO_Mode:GPIO_Mode_IN_FLOATING
2
一、通用输入/输出(GPIO)
GPIO 寄存器结构
GPIO_TypeDef 和 AFIO_TypeDef,在文件“stm32f10x_map.h”中定义如下: typedef struct { vu32 CRL; vu32 CRH; vu32 IDR; vu32 ODR; vu32 BSRR; vu32 BRR; vu32 LCKR; } GPIO_TypeDef; typedef struct { vu32 EVCR; vu32 MAPR; vu32 EXTICR[4]; } AFIO_TypeDef;
名为 PPP_StructInit 的函数,其功能为通过设置 PPP_InitTypeDef 结构中的各种参数来定义外设的功能,例 如:USART_StructInit

STM32的寄存器操作

STM32的寄存器操作

STM32的寄存器操作在STM32微控制器中,寄存器操作是一种直接访问硬件寄存器的方法,用于配置和控制微控制器的各个功能和模块。

首先,STM32微控制器的寄存器是内存中特定地址的单元。

每个寄存器都有特定的功能,如配置引脚、设置时钟、控制中断等。

寄存器通常是32位宽,但有些特殊功能的寄存器可能具有不同的宽度。

为了进行寄存器操作,首先需要包含相应的头文件,该头文件包含了寄存器的定义。

在STM32中,使用CMSIS(Cortex Microcontroller Software Interface Standard)作为中间件库,该库为开发人员提供了一组用于编程STM32的接口。

以下是使用寄存器操作的一些典型步骤:1. 引入头文件:根据所需的功能,引入相应的头文件。

例如,要访问GPIO(通用输入输出)模块的寄存器,需要包含"stm32f4xx_gpio.h"头文件。

3. 访问寄存器:使用指针访问寄存器。

通过将寄存器的基地址类型转换为指针类型,可以通过指针来访问寄存器的值。

例如,使用"(GPIO_TypeDef*)"类型转换将GPIOA_BASE转换为指向GPIO寄存器的指针。

4.配置寄存器:通过逐位或设置寄存器的相应位来配置寄存器。

寄存器的每个位都对应着不同的功能或配置选项。

可以使用逻辑或运算符(,)设置寄存器的位。

例如,要将GPIOA的第5位设置为输出模式,可以使用"(1<<5)"设置相应的位。

5.读取寄存器:通过读取寄存器的值来获取相应的状态或数据。

使用指针解引用寄存器指针来获取寄存器的当前值。

例如,可以使用"(GPIOA->IDR&(1<<5))"读取GPIOA的第5位。

6.写入寄存器:通过将要写入的值赋给寄存器来更改寄存器的状态或数据。

使用指针解引用寄存器指针并将新值赋给寄存器来写入新值。

stm32RTC实时时钟[操作寄存器+库函数]-ChangingsBlog

stm32RTC实时时钟[操作寄存器+库函数]-ChangingsBlog

stm32RTC实时时钟[操作寄存器+库函数]-ChangingsBlog"RTC"是Real Time Clock 的简称,意为实时时钟。

stm32提供了一个秒中断源和一个闹钟中断源。

RTC的技术器是一个32位的计数器,使用32.768khz的外部晶振。

2038年问题在计算机应用上,2038年问题可能会导致某些软件在2038年无法正常工作。

所有使用UNIX时间表示时间的程序都将受其影响,因为它们以自1970年1月1日经过的秒数(忽略闰秒)来表示时间。

这种时间表示法在类Unix(Unix-like)操作系统上是一个标准,并会影响以其C编程语言开发给其他大部份操作系统使用的软件。

在大部份的32位操作系统上,此“time_t”数据模式使用一个有正负号的32位元整数(signedint32)存储计算的秒数。

也就是说最大可以计数的秒数为 2^31次方可以算得:2^31/3600/24/365 ≈ 68年所以依照此“time_t”标准,在此格式能被表示的最后时间是2038年1月19日03:14:07,星期二(UTC)。

超过此一瞬间,时间将会被掩盖(wrap around)且在内部被表示为一个负数,并造成程序无法工作,因为它们无法将此时间识别为2038年,而可能会依个别实作而跳回1970年或1901年。

对于PC机来说,时间开始于1980年1月1日,并以无正负符号的32位整数的形式按秒递增,这与UNIX时间非常类似。

可以算得:2^32/3600/24/365 ≈ 136年到2116年,这个整数将溢出。

Windows NT使用64位整数来计时。

但是,它使用100纳秒作为增量单位,且时间开始于1601年1月1日,所以NT将遇到2184年问题。

苹果公司声明,Mac在29,940年之前不会出现时间问题!由于RTC是一个32位计数器,同样其计时时间是有限的。

库函数中使用到了C标准时间库,时间库中的计时起始时间是1900年,可以知道时间库中不是用有符号位的32位整数来表示时间的,否则在1968年就已经溢出了。

stm32 标准库使用说明

stm32 标准库使用说明

stm32 标准库使用说明STM32是一款由意法半导体(STMicroelectronics)推出的32位ARM Cortex-M系列微控制器。

在STM32微控制器的开发过程中,开发人员可以选择使用标准库进行开发,以便更加高效地编写和调试代码。

本文将为您提供有关STM32标准库的使用说明。

1. 引入标准库在使用STM32标准库进行开发之前,您需要将标准库文件包含到您的项目中。

通过在代码中包含"stm32fxxx.h"头文件,您可以访问STM32微控制器中的寄存器和功能。

2. 初始化时钟系统在使用STM32标准库之前,您需要初始化微控制器的时钟系统。

您可以使用"RCC_DeInit()"函数将时钟系统恢复到默认状态,然后使用"RCC_HCLKConfig()"、"RCC_PCLK1Config()"和"RCC_PCLK2Config()"函数来配置总线和外设的时钟频率。

3. 配置GPIO使用STM32标准库进行GPIO配置非常简单。

您可以使用"GPIO_Init()"函数初始化GPIO引脚,设置其输入/输出模式、速度和上下拉电阻等属性。

4. 配置外设STM32标准库还提供了许多函数来配置和控制各种外设,如定时器、串口通信、ADC等。

您可以使用这些函数来初始化外设,并设置其相关参数和工作模式。

5. 使用中断STM32标准库还支持中断处理。

您可以使用"NVIC_Init()"函数初始化中断控制器,并使用"NVIC_EnableIRQ()"函数启用特定的中断,并编写相应的中断服务程序(ISR)来处理中断事件。

6. 调试和错误处理在开发过程中,您可能会遇到调试和错误处理的情况。

STM32标准库提供了一些功能来帮助您进行调试和错误处理,如在代码中使用断言(assert)来验证参数和条件,使用"printf()"函数进行调试输出等。

stm32l0标准库函数

stm32l0标准库函数

stm32l0标准库函数STM32L0系列微控制器是广泛应用于嵌入式系统的芯片,其标准库函数提供了丰富的功能和接口,用于读取、写入和操作硬件资源。

本文将介绍STM32L0标准库函数的基本概念、常见函数以及使用方法。

一、标准库函数概述STM32L0标准库函数是一组预先编写好的函数,用于操作STM32L0微控制器的硬件资源,如GPIO、USART、ADC等。

这些函数提供了标准的接口和参数,方便开发者快速上手并实现各种功能。

标准库函数通常由STM32官方提供,并经过严格测试,以确保其可靠性和稳定性。

二、常见标准库函数1.GPIO函数:用于控制GPIO口的状态,如设置输出模式、读取输入状态等。

常见的GPIO函数包括GPIO_WriteBit、GPIO_ReadInputData等。

ART函数:用于串口通信,实现设备之间的数据传输。

常见的USART函数包括USART_SendData、USART_ReceiveData等。

3.ADC函数:用于模拟信号的采集和转换,通常用于测量温度、压力等参数。

常见的ADC函数包括ADC_StartConversion、ADC_GetConversionValue等。

除此之外,STM32L0标准库还提供了其他一些常用函数,如PWM 生成器、定时器等。

这些函数的使用方法大同小异,只需根据具体的硬件资源和需求进行适当的配置即可。

三、使用标准库函数在使用STM32L0标准库函数时,需要先了解所使用的硬件资源和相关寄存器。

然后,根据标准库函数的参数和返回值进行调用,通常需要传入相应的硬件地址和参数值。

在完成操作后,需要调用相应的清理函数或释放资源,以确保系统的稳定性和安全性。

以下是一个简单的示例代码,演示如何使用STM32L0标准库函数实现串口通信:```c#include"stm32l0xx.h"voidmain(){//配置USART参数USART_InitTypeDefUSART_InitStructure;USART_ART_BaudRate=9600;USART_ART_WordLength=USART_WordLength_8b;USART_ART_StopBits=USART_StopBits_1;USART_ART_Parity=USART_Parity_No;USART_ART_HardwareFlowControl=USART_Hardw areFlowControl_None;USART_ART_Mode=USART_Mode_Rx|USART_Mode_T x;USART_Init(USART1,&USART_InitStructure);//发送数据USART_SendData(USART1,'H');while(!USART_GetFlagStatus(USART1,USART_FLAG_TC));//等待发送完成//接收数据并处理while(USART_GetFlagStatus(USART1,USART_FLAG_RXF)==RESET); //等待接收数据uint8_treceivedData=USART_ReceiveData(USART1);//读取接收到的数据//处理接收到的数据...}```以上示例代码中,我们使用了STM32L0标准库中的USART函数来实现串口通信。

stm32 标准库函数

stm32 标准库函数

stm32 标准库函数STM32是一款流行的单片机芯片,它具有高速、低功耗等优势,成为了许多领域中的主要选择。

在使用STM32开发嵌入式系统时,使用标准库函数可以帮助我们更简单高效地完成开发任务。

STM32标准库函数是一种提供给STM32开发者使用的函数库。

它包含了众多的函数,可以帮助我们快速地构建嵌入式应用程序。

使用标准库函数可以使我们避免写复杂的底层驱动程序,提高开发效率和可维护性。

STM32标准库函数的使用非常简单。

我们只需要将库文件添加到我们的项目中,然后在代码中对特定功能调用相应的函数即可。

例如,如果我们需要控制I/O口的状态,可以调用GPIO库中提供的函数来控制。

在使用标准库函数时,我们可以自由选择使用HAL(Hardware Abstraction Layer)库或LL(Low Layer)库,两者均提供了许多常用的功能函数。

HAL库是一个高层次的API,它提供了一组功能强大的API,可以使开发者使用统一的方法进行硬件控制。

HAL库可以观察到芯片的工作状态,并自动适应各种硬件平台,非常适合初学者。

它支持几乎所有的外设控制,包括UART、I2C、SPI等常见接口。

此外,还有支持USB和以太网的组件可以方便地使用。

使用HAL库的一个优点是,它可以用来替换各种硬件平台。

LL库是一个低层次的API,它提供了对STM32底层硬件的直接访问。

LL库不需要调用底层硬件的驱动程序,它可以通过操作底层寄存器直接控制硬件功能。

LL库的优点是,它提供了更快的执行速度和更精确的控制。

总的来说,STM32标准库函数是一种十分方便的API,特别是在I/O、中断和定时器操作方面。

标准库函数不仅提高了开发效率,还保证了开发者的代码兼容性和可移植性。

开发者只需熟悉该芯片的基本概念和常用的库函数,即可轻松快捷地完成开发任务。

在实际项目中,使用STM32标准库函数可以帮助我们更快地完成嵌入式系统的开发。

对于初学者来说,可以先从HAL库开始学习,然后再逐步深入LL库,理解硬件底层操作。

STM32下的库函数和寄存器操作比较

STM32下的库函数和寄存器操作比较

STM32下的库函数和寄存器操作⽐较以 led闪烁中的flashLed函数例⼦:/**下⾯是通过直接操作库函数的⽅式实现IO控制**/while(1){GPIO_ResetBits(GPIOB,GPIO_Pin_9); //LED0对应引脚GPIOF.9拉低,亮等同LED0=0;GPIO_SetBits(GPIOB,GPIO_Pin_10); //LED1对应引脚GPIOF.10拉⾼,灭等同LED1=1;delay_ms(500); //延时300msGPIO_SetBits(GPIOB,GPIO_Pin_9); //LED0对应引脚GPIOF.0拉⾼,灭等同LED0=1;GPIO_ResetBits(GPIOB,GPIO_Pin_10); //LED1对应引脚GPIOF.10拉低,亮等同LED1=0;delay_ms(500); //延时300ms}/*********************下⾯注释掉的代码是通过位带操作实现IO⼝控制**************************************/int main(void){delay_init(168); //初始化延时函数LED_Init(); //初始化LED端⼝while(1){LED0=0; //LED0亮LED1=1; //LED1灭delay_ms(500);LED0=1; //LED0灭LED1=0; //LED1亮delay_ms(500);}}/****************************************************************************************************//*********************下⾯注释掉的代码是通过直接操作寄存器⽅式实现IO⼝控制**************************************/int main(void){delay_init(168); //初始化延时函数LED_Init(); //初始化LED端⼝while(1){GPIOF->BSRRH=GPIO_Pin_9;//LED0亮GPIOF->BSRRL=GPIO_Pin_10;//LED1灭delay_ms(500);GPIOF->BSRRL=GPIO_Pin_9;//LED0灭GPIOF->BSRRH=GPIO_Pin_10;//LED1亮delay_ms(500);}}/****************************************************************************************************//*我想说我更喜欢这样的,呵呵*/while(1){//FlashLED();*(unsigned int*)(0x40010c0c) |=0x200 ;delay_ms(100);*(unsigned int*)(0x40010c0c) &=0xfffffdff ;delay_ms(100);}版权声明:本⽂为博主原创⽂章,未经博主允许不得转载。

寄存器和库函数的操作

寄存器和库函数的操作

寄存器和库函数的操作寄存器的使⽤寄存器位操作(1) 清零,&= ~( 对应位 );原理:x & 1 = x;x & 0 = 0(2) 置⼀,|= ( 对应位 );原理:x | 1 = 1;x | 0 = x(3) 取反,^= ( 对应位 );原理:x ^ 1 = ~x;x | 0 = x寄存器位取反:可以将GPIO的 “ 端⼝位” 的状态反转,0 => 1; 1 => 0IO⼝状态反转:1、需要输出 0/12、需要反转时,寄存器ODR ^= ( )如何操作STM32的寄存器例如:#define _GPIOB_BASE 0X40010C00 //从⼿册中找到GPIOB的基地址#define GPIOB_CRL (*(unsigned int *)(_GPIOB_BASE + 0X00))#define GPIOB_CRH (*(unsigned int *)(_GPIOB_BASE + 0X04))#define GPIOB_IDR (*(unsigned int *)(_GPIOB_BASE + 0X08))#define GPIOB_ODR (*(unsigned int *)(_GPIOB_BASE + 0X0C))//(_GPIOB_BASE + 0X00),获取寄存器的“地址值”//(unsigned int *)(_GPIOB_BASE + 0X00),将该 “地址值” 转换为32位的 “指针” 类型//*(unsigned int *)(_GPIOB_BASE + 0X0C),*解指针,操作对应地址的 “内容”配置代码://配置 GPIOB5 为推挽输出RCC->APB2ENR |= (0x1<<3); //开启PB时钟GPIOB_CRL &= ~(0xF<<20);GPIOB_CRL |= (0x3<<20); //推挽输出GPIOB_ODR |= (0x1<<5); //PB5=1#define LED0_PORT GPIOB#define LED0_PIN 5#define LED1_PORT GPIOE#define LED1_PIN 5#define Led_On(port, pin) (port->ODR &= ~(0x1<<pin))#define Led_Off(port, pin) (port->ODR |= (0x1<<pin))#define Led_Toggle(port, pin) (port->ODR ^= (0x1<<pin))// Toggle/ˈtɒɡl/ v.切换, n.开关将GPIO的端⼝位的状态反转标准库函数怎么添加inc⽂件:是标准外设库函数的.h (声明) ⽂件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32库函数操作和寄存器操作
首先,两个都是C语言。

从51过渡过来的话,就先说寄存器操作。

每个MCU都有自己的寄存器,51是功能比较简单的一种,相应的寄存器也比较少,我们常用的就那么几个,像P0 P1 SMOD TMOD之类的,这些存在于标准头文件reg.h里面,因为少,所以大家就直接这么去操作了,每一位对应的意义随便翻一下手册就看得到,甚至做几个小项目就记的很清楚了。

所以做51开发的时候大多数都是直接操作寄存器。

到了STM32,原理一样,也是有自己的寄存器,但是作为一款ARM 内核的芯片,功能多了非常多,寄存器自然也就多了很多,STM32的手册有一千多页,这时候想去像51那样记住每个寄存器已经不现实了,所以ST的工程师就给大家提供了库函数这么一个东西。

这是个神器。

库函数里面把STM32的所有寄存器用结构体一一对应并且封装起来,而且提供了基本的配置函数。

我们要去操作配置某个外设的时候不需要再去翻眼花缭乱的数据手册,直接找到库函数描述拿来就可以用,这样就能把精力放在逻辑代码的开发上,而不是去费力的研究一个芯片的外设要怎么配置寄存器才能驱动起来。

简单讲就是这些了,库函数是为了让开发者从大量繁琐的寄存器操作中脱离出来的一个文件包,在使用一个外设的时候让开发者直接去调用相应的驱动函数而不是自己去翻手册一个一个配置寄存器。

有人说用库函数掌握不到芯片的精髓,见仁见智了。

熟悉一款芯片是在不断的开发使用中逐渐了解并掌握的,调试的过程中会遇到很多问题,会要求我们去跟踪相关寄存器的状态,在整个框架都已经建立起来的基础上再去对照手册做具体到寄存器每一位的分析,代码对照现象,很快就能积累起来经验,祝成功。

相关文档
最新文档