STM32寄存器操作举例

合集下载

stm32 定时器的相关寄存器

stm32   定时器的相关寄存器

定时器在STM32F10xxx系列的32位MCU上,定时器资源十分丰富,包括高级控制定时器,通用定时器和基本定时器。

此外,还有能够实现定时功能的系统滴答定时器,实时时钟以及看门狗。

关于这些定时器的介绍,占据了STM32F10xxx 参考手册1/5的篇幅,可见其功能的强大。

在低容量和中容量的STM32F103xx产品,以及互联型产品STM32F105xx和STM32F107xx中,只有一个高级控制定时器TIM1。

而在高容量和超大容量的STM32F103xx产品中,有两个高级控制定时器TIM1和TIM8。

在所有STM32F10xxx系列产品中,都有通用定时器TIM2~TIM5,除非另有说明。

除此之外,在超大容量产品中,还有通用定时器TIM9~TIM14。

在高容量和超大容量的STM32F101xx和STM32F103xx产品,以及互联型产品STM32F105xx和STM32F107xx中,有两个基本定时器TIM6和TIM7。

其中,高级控制定时器的功能最为强大,可以实现所有其他定时器的所有功能。

TrailBreaker开发板使用的是高容量的STM32F103ZE,因此有两个高级控制定时器TIM1和TIM8。

下面我们就着重介绍这两个高级控制定时器。

TIM1和TIM8简介高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。

它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM等)。

使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。

关于实验中用到的LED部分原理图和GPIO跑马灯实验所用到的相同,在此不再多做介绍。

TIM1和TIM8定时器的功能包括:16位向上、向下、向上/下自动装载计数器16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值多达4个独立通道:─ 输入捕获─ 输出比较─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出死区时间可编程的互补输出使用外部信号控制定时器和定时器互联的同步电路允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态如下事件发生时产生中断/DMA:─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)─ 输入捕获─ 输出比较─ 刹车信号输入支持针对定位的增量(正交)编码器和霍尔传感器电路触发输入作为外部时钟或者按周期的电流管理高级定时器框图和时钟简介如框图中的红框所示,红框中的部分,也是时基单元(Time-base unit),对时基单元进行设置,就可以完成基础的定时器的使用设置。

STM32微控制器寄存器说明

STM32微控制器寄存器说明

PLLXTPRE:HSE 分频器作为 PLL 输入(HSE divider for PLL entry)。由软件
置‘1’或清‘0’来分频 HSE 后作为 PLL 输入时钟。只能在关闭 PLL 时才能
写入此位。
0:HSE 不分频; 1:HSE 2 分频
PLLSRC:PLL 输入时钟源(PLL entry clock source)。由软件置‘1’或清‘0’
保 HSI HSI
留 RDY ON
位 31:26 位 25 位 24
位 23:20 位 19 位 18
位 17
位 16
位 15:8 位 7:3
保留,始终读为 0。 PLLRDY:PLL 时钟就绪标志(PLL clock ready flag)。PLL 锁定后由硬件置‘1’。 0:PLL 未锁定; 1:PLL 锁定。 PLLON:PLL 使能(PLL enable)。由软件置‘1’或清零。当进入待机和停止 模式时,该位由硬件清零。当 PLL 时钟被用作或被选择将要作为系统时钟时, 该位不能被清零。 0:PLL 关闭; 1:PLL 使能。 保留,始终读为 0。 CSSON:时钟安全系统使能(Clock security system enable)。由软件置‘1’或 清零以使能时钟监测器。 0:时钟监测器关闭; 1:如果外部 4-16MHz 振荡器就绪,时钟监测器开启。 HSEBYP:外部高速时钟旁路(External high-speed clock bypass)。在调试模式 下由软件置‘1’或清零来旁路外部晶体振荡器。只有在外部 4-16MHz 振荡器 关闭的情况下,才能写入该位。 0:外部 4-16MHz 振荡器没有旁路; 1:外部 4-16MHz 外部晶体振荡器被旁路。 HSERDY:外部高速时钟就绪标志(External high-speed clock ready flag)。由硬 件置‘1’来指示外部 4-16MHz 振荡器已经稳定。在 HSEON 位清零后,该位 需要 6 个外部 4-16MHz 振荡器周期清零。 0:外部 4-16MHz 振荡器没有就绪; 1:外部 4-16MHz 振荡器就绪。 HSEON:外部高速时钟使能(External high-speed clock enable)。由软件置‘1’ 或清零。当进入待机和停止模式时,该位由硬件清零,关闭 4-16MHz 外部振荡 器。当外部 4-16MHz 振荡器被用作或被选择将要作为系统时钟时,该位不能被 清零。 0:HSE 振荡器关闭; 1:HSE 振荡器开启。 HSICAL[7:0]:内部高速时钟校准(Internal high-speed clock calibration)。系统 启动时,这些位被自动初始化。 HSITRIM[4:0]:内部高速时钟调整(Internal high-speed clock trimming)。由软 件写入来调整内部高速时钟,它们被叠加在 HSICAL[7:0]数值上。这些位在

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个端口位的同时修改操作。

stm32 BKP寄存器操作操作寄存器+库函数

stm32 BKP寄存器操作操作寄存器+库函数

stm32 BKP 寄存器操作操作寄存器+库函数BKP 是BACKUP 的缩写,stm32f103RCTE 的内部配备了10 个16 位宽度的BKP 寄存器。

在主电源切断或系统产生复位时间时,BKP 寄存器仍然可以在备用电源的支持下保持其内容。

BKP 在实际应用中可以存入重要数据,防止被恶意查看,或用于断电等。

本例实现对BKP 寄存器的读写操作,和入侵检测和处理。

主程序中写入寄存器后,依次打印出10 个BKP 寄存器数据,然后触发GPIOC13 的入侵中断(输入低电平),在中断中打印出入侵事件发生后的寄存器内容(复位为0 )。

直接操作寄存器用到的寄存器描述如下:备份数据寄存器x(BKP_DRx) (x = 1 10):低16 位[15:0]有效,用来写入或读出备份数据。

备份控制寄存器(BKP_CR):低两位有效。

TPAL[1]:侵入检测TAMPER引脚有效电平(TAMPER pin active level)0:侵入检测TAMPER 引脚上的高电平会清除所有数据备份寄存器(如果TPE 位为1) 1:侵入检测TAMPER 引脚上的低电平会清除所有数据备份寄存器(如果TPE 位为1)TPE[0]:启动侵入检测TAMPER 引脚(TAMPER pin enable)0:侵入检测TAMPER 引脚作为通用IO 口使用1:开启侵入检测引脚作为侵入检测使用备份控制/状态寄存器(BKP_CSR):TIF[9]:侵入中断标志(Tamper interrupt flag) 0:无侵入中断1:产生侵入中断当检测到有侵入事件且TPIE 位为1 时,此位由硬件置1。

通过向CTI 位写1 来清除此标志位(同时也清除了中断)。

如果TPIE 位被清除,则此位也会被清除。

TEF[8]:侵入事件标志(Tamper event flag) 0:无侵入事件1:检测到侵入事件当检测到侵入事件时此位由硬件置1。

通过向CTE 位写1 可清除此标志位TPIE[2]:允许侵入TAMPER 引脚中断(TAMPER pin interrupt enable)0:禁止侵入检测中断1:允许侵入检测中断(BKP_CR 寄存器的TPE 位也必须被置1)注。

stm32寄存器

stm32寄存器

stm32寄存器(一种算法,用以确认发送过程中是否出错)数据寄存器:CRC_DR可读写,复位值:0xFFFF FFFF;独立数据寄存器:CRC_IDR临时存放任何8位数据;控制寄存器:CRC_CR只零位可用,用于复位CRC,对其写1复位,由硬件清零;PWR电源控制(控制和管理电源)电源控制寄存器:PWR_CR控制选择系统的电源电源控制/状态寄存器:PWR_CSR睡眠或待机模式电源控制BKP备份寄存器(用以控制和管理备份数据)备份数据寄存器x:BKP_DRx (x = 1 … 10) 10个16位数据寄存器用以存储用户数据RTC时钟校准寄存器:BKP_RTCCR控制实时时钟的运行备份控制寄存器:BKP_CR控制选择清除备份数据的类型备份控制/状态寄存器:BKP_CSR对侵入事件的控制(时钟的选择、复位、分频)时钟控制寄存器(RCC_CR)各时钟状态显示时钟配置寄存器(RCC_CFGR)时钟分频时钟中断寄存器(RCC_CIR)控制就绪中断使能与否APB2外设复位寄存器(RCC_APB2RSTR) APB1外设复位寄存器(RCC_APB1RSTR) 复位APB各功能寄存器AHB外设时钟使能寄存器(RCC_AHBENR) AHB时钟使能控制APB2外设时钟使能寄存器(RCC_APB2ENR) APB1外设时钟使能寄存器(RCC_APB1ENR) APB1时钟使能控制备份域控制寄存器(RCC_BDCR)备份域时钟控制控制/状态寄存器(RCC_CSR)复位标志寄存器AHB外设时钟复位寄存器(RCC_AHBRSTR) 复位以太网MAC模块时钟配置寄存器2(RCC_CFGR2)时钟选择与分频(设置端口的功能)端口配置低寄存器(GPIOx_CRL) (x=A..E)端口配置高寄存器(GPIOx_CRH) (x=A..E)端口输入数据寄存器(GPIOx_IDR) (x=A..E)只读数据,读出IO口的状态端口输出数据寄存器(GPIOx_ODR) (x=A..E) 可读可写端口位设置/清除寄存器(GPIOx_BSRR) (x=A..E)端口位清除寄存器(GPIOx_BRR) (x=A..E)将某一端口清零端口配置锁定寄存器(GPIOx_LCKR) (x=A..E) 用于保护端口配值AFIO寄存器(将端口重映射到其它端口用以端口的第二功能)事件控制寄存器(AFIO_EVCR)选择时间输出端口与引脚复用重映射和调试I/O配置寄存器(AFIO_MAPR) 各寄存器功能引脚重映射选择外部中断配置寄存器1(AFIO_EXTICR1)外部中断配置寄存器2(AFIO_EXTICR2)外部中断配置寄存器3(AFIO_EXTICR3)外部中断配置寄存器4(AFIO_EXTICR4)外部中断引脚重映射选择EXTI 寄存器(外部中断控制器)中断屏蔽寄存器(EXTI_IMR)用于屏蔽或开放某一引脚的中断请求事件屏蔽寄存器(EXTI_EMR)用于屏蔽或开放某一引脚的事件上升沿触发选择寄存器(EXTI_RTSR)禁止或允许某一引脚的上升沿触发下降沿触发选择寄存器(EXTI_FTSR)禁止或允许某一引脚的下降沿触发软件中断事件寄存器(EXTI_SWIER)控制某引脚的软件中断挂起寄存器(EXTI_PR)显示某线的引脚有无触发请求DMA寄存器(脱离cpu的传输模式)DMA中断状态寄存器(DMA_ISR)中断情况标志器DMA中断标志清除寄存器(DMA_IFCR)手动清除标志位DMA通道x配置寄存器(DMA_CCRx)(x = 1…7)传输控制寄存器DMA通道x传输数量寄存器(DMA_CNDTRx)(x = 1…7)数据传输剩余数量存储器DMA通道x外设地址寄存器(DMA_CPARx)(x = 1…7)设置数据传输外设源或目标地址DMA通道x存储器地址寄存器(DMA_CMARx)(x = 1…7)设置存储器地址ADC寄存器(模数转换器)ADC状态寄存器(ADC_SR)AD转换标志寄存器ADC控制寄存器1(ADC_CR1)ADC控制寄存器2(ADC_CR2)设置AD转换的各种功能ADC采样时间寄存器1(ADC_SMPR1)ADC采样时间寄存器2(ADC_SMPR2)某通道选择固定的采样时间ADC注入通道数据偏移寄存器x (ADC_JOFRx)(x=1..4) 设置数据偏移量ADC看门狗高阀值寄存器(ADC_HTR)设置模拟看门狗的阀值高限ADC看门狗低阀值寄存器(ADC_LRT)设置模拟看门狗的阀值低限ADC规则序列寄存器1(ADC_SQR1)ADC规则序列寄存器2(ADC_SQR2)ADC规则序列寄存器3(ADC_SQR3)设置ADC顺序ADC注入序列寄存器(ADC_JSQR)ADC 注入数据寄存器x (ADC_JDRx) (x= 1..4)ADC数据结果寄存器ADC规则数据寄存器(ADC_DR)DAC寄存器(数模转换器)DAC控制寄存器(DAC_CR)DAC软件触发寄存器(DAC_SWTRIGR)DAC通道1的12位右对齐数据保持寄存器(DAC_DHR12R1) DAC 通道1的12位左对齐数据保持寄存器(DAC_DHR12L1) DAC通道1的8位右对齐数据保持寄存器(DAC_DHR8R1) DAC通道2的12位右对齐数据保持寄存器(DAC_DHR12R2) DAC通道2的12位左对齐数据保持寄存器(DAC_DHR12L2) DAC通道2的8位右对齐数据保持寄存器(DAC_DHR8R2)双DAC的12位右对齐数据保持寄存器(DAC_DHR12RD)双DAC的12位左对齐数据保持寄存器(DAC_DHR12LD)双DAC的8位右对齐数据保持寄存器(DAC_DHR8RD) DAC通道1数据输出寄存器(DAC_DOR1)DAC通道2数据输出寄存器(DAC_DOR2)TIM1和TIM8寄存器(高级的定时计数寄存器)TIM1和TIM8控制寄存器1(TIMx_CR1)TIM1和TIM8控制寄存器2(TIMx_CR2)TIM1和TIM8从模式控制寄存器(TIMx_SMCR)TIM1和TIM8 DMA/中断使能寄存器(TIMx_DIER) TIM1和TIM8状态寄存器(TIMx_SR)TIM1和TIM8事件产生寄存器(TIMx_EGR)TIM1和TIM8捕获/比较模式寄存器1(TIMx_CCMR1) TIM1和TIM8捕获/比较模式寄存器2(TIMx_CCMR2) TIM1和TIM8捕获/比较使能寄存器(TIMx_CCER) TIM1和TIM8计数器(TIMx_CNT) TIM1和TIM8预分频器(TIMx_PSC)TIM1和TIM8自动重装载寄存器(TIMx_ARR)TIM1和TIM8重复计数寄存器(TIMx_RCR)TIM1和TIM8捕获/比较寄存器1(TIMx_CCR1)TIM1和TIM8捕获/比较寄存器2(TIMx_CCR2)TIM1和TIM8捕获/比较寄存器3(TIMx_CCR3)TIM1和TIM8捕获/比较寄存器(TIMx_CCR4)TIM1和TIM8刹车和死区寄存器(TIMx_BDTR)TIM1和TIM8 DMA控制寄存器(TIMx_DCR)TIM1和TIM8连续模式的DMA地址(TIMx_DMAR)TIMx寄存器(控制定时器)控制寄存器1(TIMx_CR1)控制寄存器2(TIMx_CR2)从模式控制寄存器(TIMx_SMCR)DMA/中断使能寄存器(TIMx_DIER)状态寄存器(TIMx_SR)事件产生寄存器(TIMx_EGR)捕获/比较模式寄存器1(TIMx_CCMR1) 捕获/比较模式寄存器2(TIMx_CCMR2) 捕获/比较使能寄存器(TIMx_CCER)计数器(TIMx_CNT)预分频器(TIMx_PSC)自动重装载寄存器(TIMx_ARR)捕获/比较寄存器1(TIMx_CCR1)捕获/比较寄存器2(TIMx_CCR2)捕获/比较寄存器3(TIMx_CCR3)捕获/比较寄存器4(TIMx_CCR4)DMA控制寄存器(TIMx_DCR)连续模式的DMA地址(TIMx_DMAR)TIM6和TIM7寄存器(基本定时计数器)TIM6和TIM7控制寄存器1(TIMx_CR1)TIM6和TIM7控制寄存器2(TIMx_CR2)TIM6和TIM7 DMA/中断使能寄存器(TIMx_DIER)TIM6和TIM7状态寄存器(TIMx_SR)TIM6和TIM7事件产生寄存器(TIMx_EGR)TIM6和TIM7计数器(TIMx_CNT)TIM6和TIM7预分频器(TIMx_PSC)TIM6和TIM7自动重装载寄存器(TIMx_ARR)RTC寄存器(实时时钟)RTC控制寄存器高位(RTC_CRH)RTC控制寄存器低位(RTC_CRL)16.4.3 RTC预分频装载寄存器(RTC_PRLH/RTC_PRLL) 16.4.4 RTC 预分频器余数寄存器(RTC_DIVH / RTC_DIVL) RTC计数器寄存器(RTC_CNTH / RTC_CNTL)16.4.6 RTC闹钟寄存器(RTC_ALRH/RTC_ALRL)IWDG寄存器(独立看门狗,用以监督系统硬件的正常运行)键寄存器(IWDG_KR)预分频寄存器(IWDG_PR)重装载寄存器(IWDG_RLR)状态寄存器(IWDG_SR)窗口看门狗(WWDG)寄存器(用以监督软件的正常运行)控制寄存器(WWDG_CR)配置寄存器(WWDG_CFR)状态寄存器(WWDG_SR)FSMC寄存器(可变静态存储控制器)NOR闪存和PSRAM控制器寄存器SRAM/NOR闪存片选控制寄存器1…4 (FSMC_BCR1…4)SRAM/NOR闪存片选时序寄存器1…4 (FSMC_BTR1…4)SRAM/NOR闪存写时序寄存器1…4 (FSMC_BWTR1…4) NAND 闪存和PC卡控制器寄存器PC卡/NAND闪存控制寄存器2..4 (FSMC_PCR2..4)FIFO状态和中断寄存器2..4 (FSMC_SR2..4)通用存储空间时序寄存器 2..4 (FSMC_PMEM2..4)属性存储空间时序寄存器 2..4 (FSMC_PATT2..4)I/O空间时序寄存器4 (FSMC_PIO4)ECC结果寄存器2/3 (FSMC_ECCR2/3)SDIO寄存器(数据传输控制器)SDIO电源控制寄存器(SDIO_POWER) SDIO时钟控制寄存器(SDIO_CLKCR) SDIO参数寄存器(SDIO_ARG)SDIO命令寄存器(SDIO_CMD)SDIO命令响应寄存器(SDIO_RESPCMD) SDIO响应1..4寄存器(SDIO_RESPx)SDIO数据定时器寄存器(SDIO_DTIMER) SDIO数据长度寄存器(SDIO_DLEN)SDIO数据控制寄存器(SDIO_DCTRL SDIO数据计数器寄存器(SDIO_DCOUNT) SDIO状态寄存器(SDIO_STA)SDIO清除中断寄存器(SDIO_ICR)SDIO中断屏蔽寄存器(SDIO_MASK)SDIO FIFO计数器寄存器(SDIO_FIFOCNT) SDIO数据FIFO寄存器(SDIO_FIFO)USB寄存器(usb传输控制器)通用寄存器USB控制寄存器(USB_CNTR)USB中断状态寄存器(USB_ISTR)USB帧编号寄存器(USB_FNR)USB设备地址寄存器(USB_DADDR)USB分组缓冲区描述表地址寄存器(USB_BTABLE)端点寄存器USB 端点n寄存器(USB_EPnR), n=[0..7]缓冲区寄存器发送缓冲区地址寄存器n(USB_ADDRn_TX)发送数据字节数寄存器n(USB_COUNTn_TX)接收缓冲区地址寄存器n(USB_ADDRn_RX)接收数据字节数寄存器n(USB_COUNTn_RX)CAN 寄存器(邮箱控制寄存器)CAN控制和状态寄存器CAN主控制寄存器(CAN_MCR)CAN主状态寄存器(CAN_MSR)CAN发送状态寄存器(CAN_TSR)CAN接收FIFO 0寄存器(CAN_RF0R)CAN接收FIFO 1寄存器(CAN_RF1R)CAN中断使能寄存器(CAN_IER)CAN错误状态寄存器(CAN_ESR)CAN位时序寄存器(CAN_BTR)CAN邮箱寄存器发送邮箱标识符寄存器(CAN_TIxR) (x=0..2)发送邮箱数据长度和时间戳寄存器(CAN_TDTxR) (x=0..2)发送邮箱低字节数据寄存器(CAN_TDLxR) (x=0..2)发送邮箱高字节数据寄存器(CAN_TDHxR) (x=0..2)接收FIFO邮箱标识符寄存器(CAN_RIxR) (x=0..1)接收FIFO邮箱数据长度和时间戳寄存器(CAN_RDTxR) (x=0..1) 接收FIFO邮箱低字节数据寄存器(CAN_RDLxR) (x=0..1)接收FIFO邮箱高字节数据寄存器(CAN_RDHxR) (x=0..1)CAN过滤器寄存器CAN 过滤器主控寄存器(CAN_FMR)CAN 过滤器模式寄存器(CAN_FM1R)CAN 过滤器位宽寄存器(CAN_FS1R)CAN 过滤器FIFO关联寄存器(CAN_FFA1R)CAN 过滤器激活寄存器(CAN_FA1R)CAN 过滤器组i的寄存器x (CAN_FiRx) (互联产品中i=0..27,其它产品中i=0..13;x=1..2)SPI和I2S寄存器(串行外设接口控制器)SPI控制寄存器1(SPI_CR1)SPI控制寄存器2(SPI_CR2)SPI 状态寄存器(SPI_SR)SPI 数据寄存器(SPI_DR)SPI CRC多项式寄存器(SPI_CRCPR) SPI Rx CRC寄存器(SPI_RXCRCR)SPI Tx CRC寄存器(SPI_TXCRCR)SPI_I2S配置寄存器(SPI_I2S_CFGR) SPI_I2S预分频寄存器(SPI_I2SPR)I2C寄存器(数据传输寄存器)控制寄存器1(I2C_CR1)控制寄存器2(I2C_CR2)自身地址寄存器1(I2C_OAR1)自身地址寄存器2(I2C_OAR2)数据寄存器(I2C_DR)状态寄存器1(I2C_SR1)状态寄存器2 (I2C_SR2)时钟控制寄存器(I2C_CCR)TRISE寄存器(I2C_TRISE)USART寄存器(通用同步异步收发器)状态寄存器(USART_SR)数据寄存器(USART_DR)波特比率寄存器(USART_BRR)控制寄存器1(USART_CR1)控制寄存器2(USART_CR2)控制寄存器3(USART_CR3)保护时间和预分频寄存器(USART_GTPR) OTG_FS控制和状态寄存器(数据传输控制器)OTG_FS全局寄存器OTG_FS控制和状态寄存器(OTG_FS_GOTGCTL)OTG_FS中断寄存器(OTG_FS_GOTGINT)OTG_FS AHB配置寄存器(OTG_FS_GAHBCFG)OTG_FS_USB配置寄存器(OTG_FS_GUSBCFG)OTG_FS复位寄存器(OTG_FS_GRSTCTL)OTG_FS控制器中断寄存器(OTG_FS_GINTSTS)OTG_FS中断屏蔽寄存器(OTG_FS_GINTMSK)OTG_FS接收状态调试读/OTG状态读和POP寄存器(OTG_FS_GRXSTSR / OTG_FS_GRXSTSP)OTG_FS接收FIFO长度寄存器(OTG_FS_GRXFSIZ)OTG_FS非周期性TX FIFO长度寄存器(OTG_FS_GNPTXFSIZ)OTG_FS非周期性TX FIFO/请求队列状态寄存器(OTG_FS_GNPTXSTS)OTG_FS通用控制器配置寄存器(OTG_FS_GCCFG)OTG_FS控制器ID寄存器(OTG_FS_CID)OTG_FS主机周期性发送FIFO长度寄存器(OTG_FS_HPTXFSIZ) OTG_FS设备IN端点发送FIFO长度寄存器(OTG_FS_DIEPTXFx)(其中x是FIFO的编号,x=1…4)主机模式下的寄存器OTG_FS主机模式配置寄存器(OTG_FS_HCFG)OTG_FS主机帧间隔寄存器(OTG_FS_HFIR)OTG_FS主机帧号/帧时间剩余寄存器(OTG_FS_HFNUM)OTG_FS主机周期性发送FIFO/请求队列寄存器(OTG_FS_HPTXSTS)OTG_FS主机所有通道中断寄存器(OTG_FS_HAINT)OTG_FS主机所有通道中断屏蔽寄存器(OTG_FS_HAINTMSK)OTG_FS主机端口控制和状态寄存器(OTG_FS_HPRT)OTG_FS主机通道x特性寄存器(OTG_FS_HCCHARx)(此处x代码通道号,x = 0...7)OTG_FS主机通道x中断寄存器(OTG_FS_HCINTx)(其中x代表通道号,x=0...7,)OTG_FS主机通道x中断屏蔽寄存器(OTG_FS_HCINTMSKx)(其中x为通道号,x=0...7) OTG_FS主机通道x传输长度寄存器(OTG_FS_HCTSIZx)(其中x为通道号,x=0...7)设备模式下的寄存器OTG_FS设备配置寄存器(OTG_FS_DCFG)OTG_FS设备控制寄存器(OTG_FS_DCTL)OTG_FS设备状态寄存器(OTG_FS_DSTS)OTG_FS设备IN端点通用中断屏蔽寄存器(OTG_FS_DIEPMSK)OTG_FS设备OUT端点通用中断屏蔽寄存器(OTG_FS_DOEPMSK) OTG_FS设备所有端点中断寄存器(OTG_FS_DAINT)OTG_FS所有端点中断屏蔽寄存器(OTG_FS_DAINTMSK)OTG_FS设备V BUS放电时间寄存器(OTG_FS_DVBUSDIS)OTG_FS设备V BUS脉冲时间寄存器(OTG_FS_DVBUSPULSE)OTG_FS设备IN端点FIFO空中断屏蔽寄存器(OTG_FS_DIEPEMPMSK)OTG_FS设备控制IN端点0控制寄存器(OTG_FS_DIEPCTL0)OTG设备端点x控制寄存器(OTG_FS_DIEPCTLx)(其中x为端点号,x=1…3)OTG_FS设备控制OUT端点0控制寄存器(OTG_FS_DOEPCTL0) OTG_FS设备OUT端点x控制寄存器(OTG_FS_DOEPCTLx)(其中x为端点号,x=1…3) OTG_FS设备端点x中断寄存器(OTG_FS_DIEPINTx)(其中x为端点号,x=0…3)OTG_FS设备端点x中断寄存器(OTG_FS_DOEPINTx)(其中x为端点号,x=0…3)OTG_FS设备IN端点0传输长度寄存器(OTG_FS_DIEPTSIZ0)OTG_FS设备OUT端点0传输长度寄存器(OTG_FS_DOEPTSIZ0) OTG_FS设备端点x传输长度寄存器(OTG_FS_DIEPTSIZx)(其中x 为端点号,x=1…3) OTG_FS设备IN端点传输FIFO状态寄存器(OTG-FS_DTXFSTSx)(其中x为端点号,x=0…3)OTG_FS设备端点x传输长度寄存器(OTG_FS_DOEPTSIZx)(其中x 为端点号,x=1…3) OTG_FS电源和时钟门控寄存器(OTG_FS_PCGCCTL)以太网寄存器(通信传输控制器)MAC寄存器以太网MAC设置寄存器(ETH_MACCR)以太网MAC帧过滤器寄存器(ETH_MACFFR)以太网MAC Hash列表高寄存器(ETH_MACHTHR)以太网MAC Hash列表低寄存器(ETH_MACHTLR)以太网MAC MII地址寄存器(ETH_MACMIIAR)以太网MAC MII数据寄存器(ETH_MACMIIDR)以太网MAC流控寄存器(ETH_MACFCR)以太网MAC VLAN标签寄存器(ETH_MACVLANTR)以太网MAC远程唤醒帧过滤器寄存器(ETH_MACRWUFFR)以太网MAC PMT控制和状态寄存器(ETH_MACPMTCSR)以太网MAC中断状态寄存器(ETH_MACSR)以太网MAC中断屏蔽寄存器(ETH_MAIMR)以太网MAC地址0高寄存器(ETH_MACA0HR)以太网MAC地址0低寄存器(ETH_MACA0LR)以太网MAC地址1高寄存器(ETH_MACA1HR)以太网MAC地址1低寄存器(ETH_MACA1LR)以太网MAC地址2高寄存器(ETH_MACA2HR)以太网MAC地址2低寄存器(ETH_MACA2LR)以太网MAC地址3高寄存器(ETH_MACA3HR)以太网MAC地址3低寄存器(ETH_MACA3LR)MMC寄存器以太网MMC控制寄存器(ETH_MMCCR)以太网MMC接收中断寄存器(ETH_MMCRIR)以太网MMC发送中断寄存器(ETH_MMCTIR)以太网MMC接收中断屏蔽寄存器(ETH_MMCRIMR)以太网MMC发送中断屏蔽寄存器(ETH_MMCTIMR)以太网MMC1次冲突后发送”好”帧的计数器寄存器(ETH_MMCTGFSCCR)以太网MMC1次以上冲突后发送”好”帧的计数器寄存器(ETH_MMCTGFMSCCR)以太网MMC发送”好”帧的计数器寄存器(ETH_MMCTGFCR)以太网MMC CRC错误接收帧计数器寄存器(ETH_ MMCRFCECR) 以太网MMC对齐错误接收帧计数器寄存器(ETH_ MMCRFAECR) 以太网MMC接收帧”好”单播帧计数器寄存器(ETH_ MMCRGUFCR)27.8.3。

高手带你解析STM32 BSRR BRR ODR 寄存器

高手带你解析STM32 BSRR BRR ODR 寄存器

出取反输出,当前输出为高则输出低,当前输出低则输出高),官方的库函数 就是直接对 ODR 寄存器进行操作的。代码如下: void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) { /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)[标签:内容]
一样的。也就是说,输出低电平的宏语句,可以有如下两种写法。 #define SET_BL_LOW() GPIOA->BRR=GPIO_Pin_0 等价于 #define SET_BL_LOW() GPIOA->BSRR=GPIO_Pin_0 这幺来看的话,其实 BRR 寄存器是比较多余的。而实际上,在最新的 STM32F4 系列 MCU 的 GPIO 寄存器中,已经找不到 BRR 寄存器了,仅保留了 BSRR 寄存器用 于实现端口输出高低电平。因此,在 STM32F4 系列 MCU 的库函数中,对 GPIO 口输出高低电平的函数为如下形式: void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) { /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)); assert_param(IS_GPIO_PIN_ACTION(PinState)); if(PinState != GPIO_PIN_RESET)
高手带你解析 STM32 BSRR BRR ODR 寄存器
一、用法 经常会看到类似如下的宏定义语句,用于对已经初始化后的 IO 口输出 高、低电平。 #define SET_BL_HIGH() GPIOA->BSRR=GPIO_Pin_0 #define SET_BL_LOW() GPIOA->BRR=GPIO_Pin_012 其作用类似于如下两个库函数, void GPIO_SetBits(GPIO_Typedef* GPIOx, uint16_t GPIO_Pin) void GPIO_ResetBits(GPIO_Typedef* GPIOx, uint16_t GPIO_Pin) 12 而且实际上这两个库函数就是通过修改 BSRR,BRR 寄存器的值来实现对 IO 口设置的。如下便是输出高电平的函数体: void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_arameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); assert_param(IS_GPIO_PIN(GPIO_Pin)); GPIOx->BSRR = GPIO_Pin; }12345678 因此,使用宏或者库函数本质上都是一样的。区别在于使用宏更快,而使 用函数更灵活。 二、解释 BSRR 和 BRR 都是 STM32 系列 MCU 中 GPIO 的寄存器。 BSRR 称 为端口位设置/清楚寄存器,BRR 称为端口位清除寄存器。 BSRR 低 16 位用于设置 GPIO 口对应位输出高电平,高 16 位用于设置 GPIO 口对应位输出低电平。 BRR 低 16 位用于设置 GPIO 口对应位输出低电平。高 16 位为保留地 址,读写无效。 所以理论上来讲,BRR 寄存器的功能和 BSRR 寄存器高 16 位的功能是

SPI1&SPI2_DMA通信实验(STM32)

SPI1&SPI2_DMA通信实验(STM32)

STM32学习笔记(二)——之SPI_DMA寄存器级操作一、实验目标学会配置STM32的SPI寄存器和DMA寄存器,实现STM32的SPI1与SPI2通信功能,每次发送一字节数据,并可多次发送,如果接收的数据正确,则点亮LED灯。

二、实验目的加入DMA的SPI通信相对于普通SPI通信有什么好处?ST给SPI加了DMA功能出于什么目的?我觉得这是很重要的一个问题,一直边学习边想。

以下是我的看法:减少CPU负荷?我想这应该是DMA最主要的功能,可是对于SPI通信来说,其实大部分时候我们需要根据发送的指令->目标器件的应答来决定下一个指令,所以此时CPU还是需要一直等待每次通信的结束。

而且像SD卡的操作,是一个顺序流的指令操作过程,用中断也不容易控制。

那到底加入了DMA有什么好处?仔细查看了STM32F10xxx的用户手册,发现这么一行字“连续和非连续传输:当在主模式下发送数据时,如果软件足够快,能够在检测到每次TXE的上升沿(或TXE中断),并立即在正在进行的传输结束之前写入SPI_DR寄存器,则能够实现连续的通信;此时,在每个数据项的传输之间的SPI时钟保持连续,同时BSY位不会被清除。

如果软件不够快,则会导致不连续的通信;这时,在每个数据传输之间会被清除”以及也就是说如果连续传输而不使用DMA的话,需要CPU不停检测TXE并很快地置入SPI->DR的值,对于复杂程序的话这是很难达到的,而如果使用DMA,就可以轻易实现连续传输,CPU只需等待其完成就好。

我想到的一个应用就是在写SD卡的时候,每次写一个块512字节,就可以用到,能提高SD卡的写入数据速率。

其次还可以降低功耗,记得数字集成电路老师说过一句话“软件上降低数字电路功耗的一个方法就是减少电平转换。

”那么连续通信的时候,像SPI的BSY电平转换会大大减少!最后一点,虽然效果不大,就是如果不是用DMA,那么CPU的工作就是搬运工,把SPI->DR 的内容搬到内存存储起来,而如果使用DMA,就省略了这个环节!我想,为什么实现同一个功能,有的执行起来很流畅,有的却很卡,应该和这些小细节的减载有关吧。

STM32F103串口通信寄存器设置

STM32F103串口通信寄存器设置

STM32f103寄存器配置串口通信主程序接收数据,上位机串口发送的数据已回车键结束,单片机接之后将所有数据发回。

#include "stm32f10x_lib.h" #include "sys.h"//#include "ioshezhi_jb.h" // 串口接受数据临时存储 // 接受完成标志 // 数据长度// 数据存储表 ,限制长度为 200 字节// 通信数据操作 for 循环控制 unsigned long i=0;int main(){Stm32_Clock_Init(); //io_init();//PA9、PA10IO 设置清零//P9 推挽输出, max50MHZ ; P10 上拉输入 RCC->APB2RSTR|=0x4000; RCC->APB2RSTR&=0xbfff; // 主频 72M 时,波特率为 9600 D 5// 主频 36M 时,波特率为 9600 // 主频 36M 时,波特率为 115200 //串口开,发送长度 8字节,无校验,发送开,接收开;//串口开,发送长度 9字节,偶校验,发送开,接收开; //( 有效数据还是 8 位长度 )D 6while (1){// shuru_init();// 计算输入口的值if(0x0020==((USART1->SR)&0x0020)) //如果接受到了一个字节的数据D 7{ res=USART1->DR; //读取串口寄存器数据并存在临时位置res D 8if(res!=0x0a){shubiao[len]=res;len++;} // 如果该数据不是回车符的最后一个//字节0x0a,则存入数表unsigned char res; unsigned char enddd=0; unsigned int len=0; unsigned charshubiao[200]; unsigned // 系统时钟设置//io 时钟以及输入输出选项设置RCC->APB2ENR|=0x4000; RCC->APB2ENR|=0x0004;//开启USART1时钟;① //开启GPIOA 口时钟;③ GPIOA->CRH&=0xfffff00f; GPIOA->CRH|=0x000008b0; //串口复位CD//串口停止复位 ④// USART1->BRR=0x1d4c;USART1->BRR=0x0ea6; // USART1->BRR=0x0139; // USART1->CR1|=0x200c;USART1->CR1|=0x340c;else{if(shubiao[le n-1]==0x0d){e nddd=1;le n--;};}; }; //如果是0x0a ,则判断前一个字符是不是 OxOd,(回车符ASCII 码为OxOaOd)//是的话则标记接受完成标志eddd 并删掉已接受到的前一个字节的数据};}寄存器注释:①、⑵ 时钟使能寄存器RCC->APB2ENR 参考不完全手册 P108页面需要开启的PORTA 和USART1的时钟使能位,分别在bit2和bit14,只要将这两位置 1就可以使能 PORTA 和USART1的时钟了。

STM32的IO端口高8位或低8位单独操作方法

STM32的IO端口高8位或低8位单独操作方法
位操作,都是在置1的时候对某位有影响.
举例说下怎幺对IO端口赋值:
1.对高8位/低8位/全部清零
很明显,这个只需要操作BRR寄存器即可:
对高8位清零:GPIOA->BRR=0xFF00
对低8位清零:GPIOA->BRR=0x00FF
全部清零:GPIOA->BRR=0xFFFF或GPIOA->ODR=0x0000
1,置0的位不影响原来的值
高16位应该置为0000000010101010,这个就等于~0x55(即取反)的结
果,置1使某位为ห้องสมุดไป่ตู้,置0不影响原来的值
这样,BSRR寄存器的值就是00000000101010100000000001010101,
两部分的高8位均为0,所以不会影响到IO口的高8位
总结,以下的宏实现对某端口的低8位置数,不影响高8位:
STM32的IO端口高8位或低8位单独操作方法
几天前刚接触stm32的时候,被单独操作IO口给弄糊涂了,现记录下,现
在发现其实蛮简单的,只是刚开始的时候~~~
stm32的IO端口都是16位的,如果要单独操作某高8位或低8位,则不
是那幺简单,先看两张BSRR/BRR寄存器的图:
据官方数据手册上面说,这两个寄存器用于专门对ODR进行原子操作的
#defineGPIO_WriteLow(GPIOx,a)GPIOx-
>BSRR=(((uint32_t)(uint8_t)~(a))BSRR=(((uint8_t)(uint8_t)~(a))BSRR=value的
形式,所以担心是多余的
当然了,使用下面2,3的两个宏也可以完全该清零操作~stm32固件库是不
是应该加上这两个宏/函数?

stm32 二进制写法

stm32 二进制写法

stm32 二进制写法在STM32微控制器中,您可以使用C/C++编程语言来编写代码,以执行二进制操作。

下面是一些常见的STM32二进制操作示例:设置单个引脚的状态:// 设置引脚(例如PA5)为高电平GPIOA->BSRR = GPIO_BSRR_BS5;// 清除引脚(例如PA5)为低电平GPIOA->BSRR = GPIO_BSRR_BR5;读取引脚的状态:// 读取引脚(例如PB3)的状态uint8_t pinState = (GPIOB->IDR >> 3) & 1;设置寄存器的位:// 设置USART1的CR1寄存器的TE位(发送使能)USART1->CR1 |= USART_CR1_TE;清除寄存器的位:// 清除USART1的CR1寄存器的RE位(接收使能)USART1->CR1 &= ~USART_CR1_RE;修改寄存器的位而不影响其他位:// 将USART1的CR1寄存器的M位(数据位)设置为8位,同时保留其他位不变USART1->CR1 = (USART1->CR1 & ~USART_CR1_M) | USART_CR1_M_1;这些示例演示了如何使用STM32的寄存器来执行二进制操作,以设置、读取和修改引脚状态、寄存器位等。

请注意,在实际的STM32编程中,通常使用CMSIS(Cortex Microcontroller Software Interface Standard)库,它提供了一组API函数,使编程更加高级和易用,而不必直接操作寄存器。

这些函数可以使编程更加清晰、可维护,而且更不容易出错。

关于STM32的FLASH操作

关于STM32的FLASH操作

关于STM32的FLASH操作STM32是一款由意法半导体(STMicroelectronics)推出的32位精简型单片机系列。

它采用了ARM Cortex-M内核,并在Flash和内存等方面进行了优化,提供了强大的性能和丰富的外设功能。

FLASH是STM32芯片上的一种非易失性存储器,可以用于存储应用程序代码、数据、配置信息等。

在STM32中进行FLASH操作可以通过编程和标准库函数两种方式实现。

下面将依次介绍这两种方法的使用。

一、编程方式编程方式是直接对FLASH进行底层的读写操作,需要对相关寄存器进行配置和控制。

1.写入数据在STM32的FLASH中写入数据的操作需要经历以下步骤:1) 解锁FLASH:通过FLASH_Unlock(函数解锁FLASH,使其可写入。

2) 擦除FLASH:通过FLASH_ErasePage(函数擦除要写入的FLASH扇区。

3) 写入数据:通过FLASH_ProgramByte(、FLASH_ProgramHalfWord(、FLASH_ProgramWord(等函数对FLASH进行数据写入。

4) 上锁FLASH:通过FLASH_Lock(函数上锁FLASH,防止误操作。

以下是一个简单的例子,演示如何通过编程方式对STM32的FLASH进行数据写入:```c#include "stm32f10x_flash.h"void ConfigureFlash(void)FLASH_Unlock(; // 解锁FlashFLASH_ClearFlag(FLASH_FLAG_EOP , FLASH_FLAG_PGERR ,FLASH_FLAG_WRPRTERR); // 清除状态标志FLASH_ErasePage(FLASH_START_ADDR); // 擦除扇区FLASH_Lock(; // 上锁Flash```2.读取数据读取STM32的FLASH数据需要通过指针的方式直接读取存储器的地址,如下所示:```c#define READ_FLASH(addr) (*(volatile uint32_t*)(addr))void ReadFlash(void)uint32_t data = READ_FLASH(FLASH_START_ADDR);//在这里对读取的数据进行处理```二、标准库函数方式STM32提供了一套标准库函数,方便开发者进行FLASH操作。

一个菜鸟的STM32寄存器学习笔记2_输入按键扫描

一个菜鸟的STM32寄存器学习笔记2_输入按键扫描
while(1) {
if(GPIOB->IDR&0X00000001==0) {
GPIOC->BSRR=0x00020000; } else GPIOC->BSRR=0x00000002; }}
(key 用的是 GIOB.0)
3. 获取按键 KEY 的值并进行判断
二.详细说明(按键使用的是 GPIOB 的 0 脚没有外接上拉或者下拉电阻,LED 是 GPI 的时钟
这里配置时钟和配置 LED 是一样的把对应的位写上 1 即可(补充一个 LED 那个文档的 一个问题:在 LED 那个笔记里说给某位写 1 要先清零再写入,感觉没有必要清零,使用 的位或方法不管原来里面是 1 还是 0 或上 1 还是 1。给某位写 0 一样,只要和 0 位与就 可以) 我们要给 GPIOC 和 GPIOB 时钟使能就位或一个数就可以要给 GPIOC 使能
现在需要它来设置上拉下拉我的理解是如果需要下拉就向对应的引脚写0让这个引脚默认是低电平效果和在外部下拉电阻一样想设置成上拉电阻就和向该位写1就等于把该位的电平默认设置为高电平所以要使用内部的上拉下拉输入模式需要gpiobodr0xfffffffe
使用 GPIO 输入功能实现按键扫描,来控制 LED 灯的亮灭
硬件分成两种情况 1.有外界上拉/下拉电阻配置成 浮空输入 2.无外部上拉/下拉电阻配置成 上拉/下拉输入模式
GPIOC.1 对应 LED 配置成强制推挽输出不再 GPIOC->CRL&=0XFFFFFF0F; GPIOC->CRL|=0X00000030;// CNF1=00 ,MODE1=11 合在一起是 3
RCC->APB2ENR|=0X00000010; RCC->APB2ENR|=0X00000008;

基于寄存器操作的STM32高级定时器TIM1的四路PWM输出程序讲解

基于寄存器操作的STM32高级定时器TIM1的四路PWM输出程序讲解

基于寄存器操作的STM32高级定时器TIM1的四路PWM输出程序讲解STM32高级定时器TIM1具有四个独立的PWM输出通道,可以用来控制四个不同的设备或驱动器。

在本篇文章中,我们将详细讲解如何使用寄存器操作实现TIM1的四路PWM输出。

首先,需要了解几个相关的概念。

STM32的定时器是通过寄存器进行配置和操作的,其中TIM1是高级定时器,具有更高级的功能和更多的寄存器。

PWM(脉冲宽度调制)是一种常见的控制技术,可实现模拟信号的数字化控制,通过调整高电平和低电平的时间比例来控制目标设备或驱动器的动作。

在开始编写程序之前,我们首先需要对TIM1进行初始化和配置。

以下是一个基本的初始化函数示例:```void TIM1_PWM_Init//开启TIM1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//初始化TIM1的配置TIM_TimeBaseInitTypeDef TIM_BaseStruct;TIM_OCInitTypeDef TIM_OCStruct;TIM_BaseStruct.TIM_Prescaler = 0;TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_BaseStruct.TIM_Period = 999; // 设置周期为1000TIM_BaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_BaseStruct.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM1, &TIM_BaseStruct);//配置输出比较通道TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable;TIM_OCStruct.TIM_Pulse = 0; // 设置脉冲宽度,0表示低电平TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init(TIM1, &TIM_OCStruct);TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC2Init(TIM1, &TIM_OCStruct);TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC3Init(TIM1, &TIM_OCStruct);TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC4Init(TIM1, &TIM_OCStruct);TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);//启动定时器TIM_Cmd(TIM1, ENABLE);```上述代码是一个初始化TIM1的函数示例,其中包含了基本的配置步骤。

STM32GPIO相关寄存器

STM32GPIO相关寄存器

STM32 GPIO 相关寄存器每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分别控制每个端口的高八位和低八位,如果IO口是0-7号的话,则写CRL寄存器,如果IO口是8-15号的话,则写CRH寄存器,两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR)一个是只读作输入数据寄存器,一个是只写作输出寄存器,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。

常用的IO端口寄存器只有四个:CRH,CRL,IDR,ODR.数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。

每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访问)。

另外,STM32的每个端口使用前都要将其时钟使能,STM32的GPIO的时钟统一挂接在APB2上,具体的使能寄存器为RCC_APB2ENR,该寄存器的第2位到第8位分别控制GPIOx(x=A,B,C,D,E,F,G)端口的时钟使能,当外设时钟没有启用时,程序不能读出外设寄存器的数值,如打开PORTA 时钟:RCC—>APB2ENR|=1〈<2; //使能PORTA时钟使能外设时钟后,GPIOA的十六位就可以按照设定的状态工作了,之后就是具体设置哪一位了以第八位为例即高位的首位,在GPIOx_CRH寄存器中进行设置,GPIOA的每一位都有该寄存器的四位来设定相应的参数,这四位中的高两位(CNF0,CNF1)设置GPIO的输入输出模式,低两位(MODE0,MODE1)是设置GPIO的输出频率,具体可以参考STM32参考手册。

GPIOA->CRH&=0XFFFFFFF0; //清掉PA8原来的设置,同时屏蔽其它端口,不影响其它端口的设置GPIOA—〉CRH|=0X00000003;//PA8 推挽输出十六进制中的3 换成二进制 00 11 前两位00表示推挽输出,11代表输出频率50Mhz,若CRH|=0x4,表示模拟输入模式(ADC用),0x3表示推挽输出模式(作输出口用,50M速率),0x8表示上/下拉输入模式(做输入口用),0xB表示复用输出(使用IO口的第二功能,50M速率). 这是对一位的操作,当然也可以多位操作,因为STM32对GPIO操作必须是32位全字操作,设置完成后GPIOA的第8位就可以使用了之后给GPIOA—>ODR=0x xxxx xxxx送数据就行了。

STM32串口寄存器

STM32串口寄存器

当RXNE仍然是’1’的时候,当前被接收在移位寄存器中的数据,需要传送至RDR寄存器时,硬 件将该位置位。如果USART_CR1中的RXNEIE为’1’的话,则产生中断。由软件序列将其清零 (先读USART_SR,然后读USART_CR)。
0:没有过载错误;
1:检测到过载错误。
注意:该位被置位时,RDR寄存器中的值不会丢失,但是移位寄存器中的数据会被覆盖。如果 设置了EIE位,在多缓冲器通信模式下,ORE标志置位会产生中断的。
TXEIE:发送缓冲区空中断使能 (TXE interrupt enable) 该位由软件设置或清除。 0:禁止产生中断; 1:当USART_SR中的TXE为’1’时,产生USART中断。
TCIE:发送完成中断使能 (Transmission complete interrupt enable) 该位由软件设置或清除。 0:禁止产生中断; 1:当USART_SR中的TC为’1’时,产生USART中断。
位2
NE: 噪声错误标志 (Noise error flag)
在接收到的帧检测到噪音时,由硬件对该位置位。由软件序列对其清玲(先读USART_SR,再 读USART_DR)。
0:没有检测到噪声;
1:检测到噪声。
注意:该位不会产生中断,因为它和RXNE一起出现,硬件会在设置RXNE标志时产生中断。 在多缓冲区通信模式下,如果设置了EIE位,则设置NE标志时会产生中断。
位12
位11
12 11 10 M WAKE PCE rw rw rw
9
8
7
6
5
4
3
PS
PEIE TXEIE TCIE
RXNE IE
IDLE IE
TE

stm32f4 寄存器点灯实验原理

stm32f4 寄存器点灯实验原理

stm32f4 寄存器点灯实验原理原理是通过编程直接操作STM32F4芯片的GPIO寄存器来控制LED的亮灭。

具体的步骤如下:1. 首先,需要设置相应的引脚为输出模式。

通过修改GPIOx_MODER寄存器的相应位可以实现,将对应的引脚设置为输出模式。

2. 然后,需要设置相应的引脚输出高电平或低电平来点亮或熄灭LED。

通过修改GPIOx_ODR寄存器的相应位可以实现,将对应的引脚输出高电平或低电平。

3. 最后,程序将会在一个循环中反复执行设置输出低电平和高电平的操作,从而实现让LED闪烁的效果。

需要注意的是,在STM32F4中,不同的引脚对应的控制寄存器和位数是不同的,具体需要根据芯片手册来查找相应的寄存器和位数。

同时,在进行寄存器操作时,需要确保停用IO模块时钟使能,以免发生错误。

下面是一个使用STM32F4的GPIO控制LED点灯的简单示例代码:```c#include "stm32f4xx.h"void Delay(uint32_t nTime);int main(void){GPIO_InitTypeDef GPIO_InitStruct;// 启用GPIO的时钟使能RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);// 配置引脚为输出模式GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOD, &GPIO_InitStruct);while (1){// 点亮LEDGPIO_SetBits(GPIOD, GPIO_Pin_12);Delay(1000000);// 熄灭LEDGPIO_ResetBits(GPIOD, GPIO_Pin_12);Delay(1000000);}}// 延时函数void Delay(uint32_t nTime){if (nTime != 0){nTime--;while (nTime != 0);}}```在上述代码中,我们使用了寄存器操作来控制GPIO的输出。

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.写入寄存器:通过将要写入的值赋给寄存器来更改寄存器的状态或数据。

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

STM32控制器位带操作详解

STM32控制器位带操作详解

STM32控制器位带操作详解位带操作是一种通过使用特殊内存映射技术,将单个位对应的整个字节或字长的操作进行原子化的方式。

位带操作在嵌入式系统中广泛应用于对特定寄存器位进行读写、置位或清除等操作,能够提高代码可读性和可维护性,并且能够避免在多线程或中断环境下的竞争条件。

在STM32控制器中,每个外设寄存器都由32位的数据类型表示,在位带操作中我们可以将每个寄存器的每个位映射到指定的位带区域。

对于STM32F4系列的控制器,它提供了16个非连续的位带区域,每个区域包含了32个32位的位带操作寄存器。

使用位带操作,我们可以通过以下步骤来进行位带操作:1.定义位带区域的基地址:将外设寄存器的基地址加上偏移量来得到位带区域的基地址。

```c//使用位带操作的函数示例uint32_t *BIT_BAND_SRAM(uint32_t periph, uint32_t pin)return (uint32_t *)(PERIPH_BB_BASE + ((periph - PERIPH_BASE) << 5) + (pin << 2));}//使用位带操作的宏示例#define BIT_BAND_SRAM(periph, pin) \*((uint32_t *)(PERIPH_BB_BASE + ((periph - PERIPH_BASE) << 5) + (pin << 2)))```2. 定义位带操作寄存器的别名:使用`uint32_t*`来定义位带操作寄存器的别名,并将其指向位带区域的基地址。

```cuint32_t *GPIOA_BSRR_ALIAS = BIT_BAND_SRAM(GPIOA_BASE,GPIO_BSRR_OFFSET);```3.对位进行操作:使用位带别名操作寄存器时,可以直接对寄存器的位进行操作,例如置位、清除或读取。

```c//设置GPIOA的第5位为高电平*GPIOA_BSRR_ALIAS,=(1<<5);//清除GPIOA的第5位*GPIOA_BSRR_ALIAS&=~(1<<5);//读取GPIOA的第5位uint32_t bitValue = *GPIOA_BSRR_ALIAS & (1 << 5);```位带操作的好处是使代码更加清晰明了,在多任务或多线程的环境下,能够避免竞争条件和冲突,并提供原子性的操作。

STM32F10x 参考手册备份寄存器

STM32F10x 参考手册备份寄存器

9 备份寄存器(BKP)9.1 简介备份寄存器是十个16位的寄存器,可用来存储20个字节的用户应用程序数据。

他们处在备份域里,当V DD电源被切断,他们仍然由V BAT维持供电。

当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。

此外,BKP控制寄存器用来管理侵入检测和RTC校准功能。

复位后,对备份寄存器和RTC的访问被禁止,并且备份域被保护以防止可能存在的意外的写操作。

电源控制寄存器(PWR_CR)的DBP位必须被置1,以允许访问备份寄存器和RTC.9.2 特性● 十个16位数据寄存器● 用来管理防侵入功能的状态/控制寄存器● 用来存储RTC校验值的校验寄存器。

检测侵入检测9.3 侵入当ANTI_TAMP引脚上的信号从0变成1或者从1变成0(取决于备份控制寄存器BKP_CR的TPAL位),会产生一个侵入检测事件。

侵入检测事件将所有数据备份寄存器复位。

然而为了避免丢失侵入事件,侵入检测信号是边沿检测的信号与侵入检测允许位的逻辑与,从而在侵入检测引脚被允许前发生的侵入事件也可以被检测到。

● 当TPAL=0时:如果在启动侵入检测引脚前(通过设置TPE位)该引脚已经为高电平,一旦启动侵入检测功能,则会产生一个额外的侵入事件(尽管在TPE位置1后并没有出现上升沿)。

● 当TPAL=1时:如果在启动侵入检测引脚前(通过设置TPE位)该引脚已经为低电平,一旦启动侵入检测功能,则会产生一个额外的侵入事件(尽管在TPE位置1后并没有出现下降沿)。

在一个侵入事件被检测到并被清除后,侵入检测引脚应该被禁止。

然后,在再次写入备份数据寄存器前重新用TPE位启动侵入检测功能。

这样,可以阻止软件在侵入检测引脚上仍然有侵入事件时对备份数据寄存器进行写操作。

这相当于对侵入引脚进行电平检测。

注:当V DD电源断开时,侵入检测功能仍然有效。

为了避免不必要的复位数据备份寄存器,ANTI_TAMP引脚应该在片外连接到正确的电平。

基于寄存器操作的STM32高级定时器TIM1的四路PWM输出程序讲解

基于寄存器操作的STM32高级定时器TIM1的四路PWM输出程序讲解

经过一天的努力,终于把stm32 tim1的四路pwm输出搞了出来,为了使大家快速的用起tim1,打算写这篇文档与大家分享。

stm32 tim1功能丰富。

针对pwm输出与tim2只有细小的差别,之前在网上找了一些网友的程序,发现大部分都是基于库文件写的,不能对tim1的pwm输出有深层次的理解,个人认为一个合格的程序员,想要最大程度的用好一个片子的话还是要针对寄存器直接操作,完全了解定时器的运行过程,可以对片子的结构有一定的了解。

高级控制定时器(TIM1 和TIM8) 由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。

它适合多种用途,包含测量输入信号的脉冲宽度( 输入捕获) ,或者产生输出波形( 输出比较、PWM、嵌入死区时间的互补PWM等)。

使用定时器预分频器和RCC 时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。

高级控制定时器(TIM1 和TIM8) 和通用定时器(TIMx) 是完全独立的,它们不共享任何资源。

请读者仔细阅读一下信息:脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。

在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM 模式1) 或’111’(PWM 模式2) ,能够独立地设置每个OCx输出通道产生一路PWM。

必须通过设置TIMx_CCMRx寄存器的OCxPE位使能相应的预装载寄存器,最后还要设置TIMx_CR1 寄存器的ARPE 位,( 在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。

仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIMx_EGR寄存器中的UG位来初始化所有的寄存器。

OCx的极性可以通过软件在TIMx_CCER寄存器中的CCxP位设置,它可以设置为高电平有效或低电平有效。

OCx的输出使能通过(TIMx_CCER和TIMx_BDTR寄存器中)CCxE、CCxNE、MOE、OSSI和OSSR 位的组合控制。

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

那么很明显,只可能是 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
#define PERIPH_BASE #define APB2PERIPH_BASE #define GPIOB_BASE
((uint32_t)0x40000000) (PERIPH_BASE + 0x10000) (APB2PERIPH_BASE + 0x0C00)
没错,和 keil 里面是一模一样的。
都是有意义的名字,哪里难记了??而且名字都来自 ST 的官方 datasheet、这个程序跟你用 51 写的程 序我还真的 没看出差别有很大 .....
加入刚才的 GPIOB 寄存器,看看 ST 的官方库是怎么定义的, \Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\stm32f10x.h 用 UltraEdit 打开,搜索 GPIOB
其中 __IO 的定义在 \Libraries\CMSIS\CM3\CoreSupport\core_cm3.h 为什么我知道在这个文件里面, 因为我会 用 source insight ...
#define __IO volatile
__IO uint32_t CRL 其实就是 volatile uint32_t CRL
例如我需要操作 GPIOB_CRL 的偏移为 00H ,(看 STM3210x 参考手册.pdf) ODR 寄存器的偏移为 0CH 那么很自然得出 GPIOB_CRL = 0x40010C00 GPIOB_ODR = 0x40010C0C
怎么验证我的结论正确?先看 keil 给的头文件 \Keil\ARM\INC\ST\STM32F10x\stm32f10x_map.h
#define RCC_BASE
(AHBPERIPH_BASE + 0x1000)
ቤተ መጻሕፍቲ ባይዱ
RCC_APB2ENR 的偏移是 18H ,所以最终得到地址为 0x40021018,操作方法同上
*(volatile unsigned long *)0x40021018 |= 1<<3;
最终的点 LED 的程序就完成了。 void main(void) {
找到问题的原因,则再 RCC_APB2ENR 设置,其中 BIT 3 就是 IOPBEN 是时钟使能位,同上,先找到
RCC_APB2ENR 的地址
#define PERIPH_BASE
((u32)0x40000000)
#define AHBPERIPH_BASE
(PERIPH_BASE + 0x20000)
同理,设置 ODR 寄存器 *(volatile unsigned long *)0x40010C0C = 1<<5; *(volatile unsigned long *)0x40010C0C = 0;
STM32 没有 SFR ,没有 bit,没有 sbit 的概念的了。是不是就不如 51 了?
下载运行,还不行,因为 GPIOB 的 CLK 没有使能,这时其实 GPIOB 是不能工作的,这是 STM32 特殊 的地方,上电 默认外设的时钟都是关的,初学者没有注意这里,是可以原谅的,多看看书,多实践,多问问就是了。
(*volatile unsigned long)0x40010C00 = (2<<20) | (0<<22); // 为简单起见,不管其他位了
楼主你是否能看懂这句 C 语言??volatile 什么意思什么用?指针的本质是什么?为什么能这样用? 2<<20 是什么 意思,为什么能这样用?楼主我真的不是为难你,嵌入式都这么写的,ST 的头文件也是这么定义
void main(void)
{ RCC_APB2ENR |= 1<<3; GPIOB_CRL = (2<<20) | (0<<22); GPIOB_ODR = 1<<5; while (1) {
} }
RCC_APB2ENR RCC 是时钟寄存器 , APB2 是外设 2 ,ENR ,可以理解为 enable GPIOB_CRL GPIO B control 控制寄存器 GPIOB_ODR GPIO(general purpose input output) B output data register 输出数据寄存器
如何用寄存器的方法操作 STM32
这个文章是摘自阿莫论坛,觉得写得很不错,就收藏下来了,整理成文档,希望更多的 人能看到
既然我们要操作 IO 口,当然就要看 IO 口相关的知识。打开 STM3210x 参考手册.pdf ,我的目的只是操 作 GPIO 所以我只需要将第五章看完就 OK 了。章节比较多,懒得看,根据一般的经验(楼主,你缺经验了吧?), 不说多 就 AVR 和 PIC 而已。操作 IO 一般是两个步骤,第一,操作 IO 控制寄存器,设置 IO 为输出,第二就是 送数据。
#define PERIPH_BASE
((u32)0x40000000)
#define APB2PERIPH_BASE
(PERIPH_BASE + 0x10000)
#define GPIOB_BASE
(APB2PERIPH_BASE + 0x0C00)
这样怎么算都能算出 0x40010C00 出来吧??ODR 寄存器同理
还有,STM 的库下载的时候包含了很多很多例子,库函数怎么使用在例子里面有很详细的介绍,不用写几 行代码, 都是复制例子做实验,也很很容易的。
总结楼主的几个问题 1,ARM 没有 SFR,也不需要,SFR 是 51 的关键字,没有理由 51 有 ARM 就要有。例如 ACC,ARM 就 没有,但是有 R0-R15 ,这些就是架构(architecture 的区别了) 2,STM32 的寄存器在官方头文件上面已经全部有定义了,上面已经阐述了。(你看不懂不代表没有吧?) 3,不带库函数的 LED 程序已经实现了。
*(volatile unsigned long *)0x40021018 |= 1<<3; *(volatile unsigned long *)0x40010C00 = (2<<20) | (0<<22); *(volatile unsigned long *)0x40010C0C = 1<<5; while (1) {
为什么用结构体?因为结构体的成员的地址分配(RAM 中)是连续(不知道楼主是否懂得,这还是 C 语言 的问题), 而 STM32 的一个模块的功能寄存器都是连续的,每个寄存器都是相当于 基地址加偏移,跟上面的理论一 致
于是就有了结构体指针的用法 跟踪库函数的源代码,例如 GPIO 的 初始化函数 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
为了点亮 LED ,我需要将 PB5 (也就是 GPIOB5)设置为输出,并且 ODR 相应的位写入 1 ,看资料得 出 MODE5 是 bit 20 21 控制的,CNF5 是 bit 22,23 MODE5 应该设置 10(0x2) 选择 2MHZ 输出,CNF5 选择 00(0x0),通用推挽模式,于是将这个值写入
相关文档
最新文档