收藏 分销(赏)

STM编程心得.doc

上传人:xrp****65 文档编号:7661345 上传时间:2025-01-11 格式:DOC 页数:23 大小:1.31MB
下载 相关 举报
STM编程心得.doc_第1页
第1页 / 共23页
STM编程心得.doc_第2页
第2页 / 共23页
点击查看更多>>
资源描述
STM编程心得 一.Keil的设置: 1. 添加目录: 选择Options for Target 'Target1' 选择Include Paths,添加项目包含的目录 二. 程序编写: 初始化时钟 RCC->RC时钟控制寄存器定义 32位寄存器(位数) 25 24 19 18 定义 PLLRDY PLLON CSSON HSEBYP 17 16 15:8 7:3 1 0 HSERDY HSEON HSICAL[7:0] HSITRIM[4:0] HSIRDY HSION PLLRDY:PLL时钟就绪标志,PLL锁定后由硬件置1,0=PLL未锁定,1=PLL锁定。 PLLON:PLL使能,当进入待机和停止模式时,硬件清零。 当PLL时钟作为系统时钟时,该位不能被清零 0=PLL关闭,1=PLL使能。 CSSON:时钟安全系统使能,0=时钟检测器关闭,1=如果外部4-16MHz振荡器就 绪,时钟检测器开启。 HSERDY:外部告诉时钟就绪标志,0=外部4-16MHz振荡器没就绪,1=外部4-16MHz 振荡器就绪。 HSEON:外部高速时钟使能,当进入待机和停止模式时,硬件清零。 当4-16MHz振荡器作为系统时钟时,该位不能被清零 0=HSE振荡器关闭,1=HSE振荡器开启。 HSICAL[7:0]:内部高速时钟校准。系统启动初始化 HSITRIM[4:0]:内部高速时钟调整,默认16,可以把HSI调整到8MHz±1%,每步 HSICAL变化调整越40kHz。 HSIRDY:内部高速时钟就绪标志,0=内部8MHz振荡器没就绪,1=内部8MHz振荡 器就绪。 HSION:内部高速时钟使能,当内部8MHz振荡器被直接或间接地用作或被选择将 要作为系统时钟时,该位不能被清零。 0=内部8MHz振荡器关闭,1=内部8MHz振荡器开启。 时钟配置寄存器RCC->CFGR 32位寄存器(位数) 26:24 22 21:18 17 定义 MCO[2:0] USBPRE PLLMUL[3:0] PLLXTPRE 16 15:14 13:11 10:8 7:4 PLLSRC ADCPRE[1:0] PPRE2[2:0] PPRE1[2:0] HPRE[3:0] 3:2 1:0 SWS[1:0] SW[1:0] MCO[2:0]:微控制器时钟输出,0XX=没有时钟输出, 100=系统时钟(SYSCLK)输出, 101=内部RC振荡器时钟(HSI)输出 110=外部振荡器时钟(HSE)输出 111=PLL时钟2分频后输出 USBPRE:USB预分频,0=PLL时钟1.5倍分频作为USB时钟 1=PLL时钟直接作为USB时钟 PLLMUL:PLL倍频系数,PLL输出频率不超过72MHz, 0000=PLL2倍频 0001=PLL3倍频 0010=PLL4倍频 0011=PLL5倍频 0100=PLL6倍频 0101=PLL7倍频 0110=PLL8倍频 0111=PLL9倍频 1000=PLL10倍频 1001=PLL11倍频 1010=PLL12倍频 1011=PLL13倍频 1100=PLL14倍频 1101=PLL15倍频 1110=PLL16倍频 1111=PLL16倍频 PLLXTPRE:HSE分频器作为PLL输入,0=HSE不分频,1=HSE 2分频 PLLSRC:PLL输入时钟源,0=HSI振荡器时钟经2分频后作为PLL输入时钟 1=HSE时钟作为PLL输入时钟 ADCPRE[1:0]:ADC预分频,00=PCLK2 2分频后作为ADC时钟, 01=PCLK2 4分频后作为ADC时钟, 10=PCLK2 6分频后作为ADC时钟, 11=PCLK2 8分频后作为ADC时钟。 PPRE2[2:0]:高速APB预分频(APB2),0XX=HCLK不分频 100=HCLK 2分频 101=HCLK 4 分频 110=HCLK 8 分频 111=HCLK 16分频 PPRE1[2:0]:低速APB预分频(APB1),0XX=HCLK不分频 100=HCLK 2分频 101=HCLK 4 分频 110=HCLK 8 分频 111=HCLK 16分频 HPRE[3:0]:AHB预分频,0XXX=SYSCLK不分频 1000=SYSCLK 2 分频 1001=SYSCLK 4 分频 1010=SYSCLK 8 分频 1011=SYSCLK 16 分频 1100=SYSCLK 64 分频 1101=SYSCLK 128 分频 1110=SYSCLK 256 分频 1111=SYSCLK 512 分频 SWS[1:0]:系统时钟切换状态,00=HSI作为系统时钟 01=HSE作为系统时钟 10=PLL输出系统时钟 11=不可用 SW[1:0]:系统时钟切换,00=HSI作为系统时钟 01=HSE作为系统时钟 10=PLL输出作为系统时钟 11=不可用 例程: Void Stm32_Clock_Init(u8 PLL) { unsigned char temp = 0; MYRCC_DeInit(); RCC->CR |= 0x00010000;//外部高速时钟使能HSEON=1 While(!(RCC->CR>>17));//将HSEON右移17位,等HSERDY=1(外部时钟就绪) RCC->CFGR = 0x00000400;//APB1/2 = DIV2;AHB =DIV1; PLL -= 2;//和寄存器设定值相差2个单位; RCC->CFGR |= PLL<<18; //设置PLL值2~16 RCC->CFGR |= 1<<16; //PLSRC ON FLASH->ACR |= 0x32; //FLASH 2个延时周期 RCC->CR |= 0x01000000; //PLLON While(!(RCC->CR>>25)) //等待PLL锁定 RCC->CFGR |= 0x00000002;//PLL作为系统时钟SW=0x10 While(temp != 0x02) //等待PLL作为系统时钟设置成功 SWS是否0x10 { temp = RCC->CFGR>>2; temp &= 0x03; } } 延时函数 SysTick->CTRL系统时钟控制寄存器定义: 32位寄存器(位数) 16 2 1 0 定义 COUNTFLAG CLKSOURCE TICKINT ENABLE COUNTFLAG:如果在上次读取本寄存器后,SysTick已经数到了0,则该位置1。如果读取该位将自动清零。 CLKSOURCE:0=外部时钟源(STCLK) 1=内核时钟(FCLK)。 TICKINT:1=SysTick倒数到0时产生SysTick异常请求 0=数到0时无动作 ENABLE:SysTick定时器的使能位 SysTick->LOAD系统时钟重载寄存器定义 32位寄存器(位数) 23:0 定义 RELOAD RELOAD:当倒数至0时,将被重装载的值。 SysTick->VAL系统时钟当前值寄存器定义 32位寄存器(位数) 23:0 定义 CURRENT CURRENT:读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick控制及状态寄存器中的COUNTFLAG标志。 例程: void delay_init(u8 SYSCLK) { SysTick->CTRL&=0xfffffffb;//CLKSOURCE=0,选择外部时钟源。 fac_us=SYSCLK/8; //系统时钟SYSCLK= fac_ms=(u16)fac_us*1000; } void delay_ms(u16 nms) { u32 temp; SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit) SysTick->VAL =0x00; //清空计数器,不需要重载 SysTick->CTRL=0x01 ; //开始倒数 do { temp=SysTick->CTRL; //不停读取CTRL,检查COUNTFLAG } while(temp&0x01 && !(temp&(1<<16)));//SysTick使能开启,计数未到0 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器,不需要重载 } void delay_us(u32 nus) { u32 temp; SysTick->LOAD=nus*fac_us; //时间加载 SysTick->VAL=0x00; //清空计数器 SysTick->CTRL=0x01 ; //开始倒数 do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//等待时间到达 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } 外设时钟控制 AHB外设时钟使能寄存器RCC->AHBENR 32位寄存器(位数) 16 15 14 12 定义 ETHMACRXEN ETHMACTXEN ETHMACEN OTGFSEN 6 4 2 1 0 CRCEN FLITFEN SRAMEN DMA2EN DMA1EN ETHMACRXEN:以太网MAC接收时钟使能, 0=以太网MAC接收时钟关闭 1=以太网MAC接收时钟开启 ETHMACTXEN:以太网MAC发送时钟使能, 0=以太网MAC发送时钟关闭 1=以太网MAC发送时钟开启 ETHMACEN:以太网MAC时钟使能, 0=以太网MAC时钟关闭 1=以太网MAC时钟开启 OTGFSEN:全速USBOTG时钟使能, 0=全速USBOTG时钟关闭 1=全速USBOTG时钟开启 CRCEN:CRC时钟使能, 0=CRC时钟关闭 1=CRC时钟开启 FLITFEN:闪存接口电路时钟使能, 0=睡眠模式时闪存接口电路关闭 1=睡眠模式时闪存接口电路开启 SRAMEN:SRAM时钟使能, 0=睡眠模式时SRAM时钟关闭 1=睡眠模式时SRAM时钟关闭 DMA2EN:DMA2时钟使能, 0=DMA2时钟关闭 1=DMA2时钟开启 DMA1EN:DMA1时钟使能, 0=DMA1时钟关闭 1=DMA1时钟开启 APB2外设时钟使能寄存器RCC->APB2ENR 32位寄存器(位数) 14 12 11 10 定义 USART1EN SPI1EN TIM1EN ADC2EN 9 6 5 4 3 ADC1EN IOPEEN IOPDEN IOPCEN IOPBEN 2 0 IOPAEN AFIOEN USART1EN:USART1时钟使能, 0=USART1时钟关闭 1=USART1时钟开启 SPI1EN:SPI1时钟使能, 0=SPI1时钟关闭 1=SPI1时钟开启 TIM1EN:TIM1定时器时钟使能, 0=TIM1定时器时钟关闭 1=TIM1定时器时钟开启 ADC2EN:ADC2接口时钟使能, 0=ADC2接口时钟关闭 1=ADC2接口时钟开启 ADC1EN:ADC1接口时钟使能, 0=ADC1接口时钟关闭 1=ADC1接口时钟开启 IOPEEN:IO端口E时钟使能, 0=IO端口E时钟关闭 1=IO端口E时钟开启 IOPDEN:IO端口D时钟使能, 0=IO端口D时钟关闭 1=IO端口D时钟开启 IOPCEN:IO端口C时钟使能, 0=IO端口C时钟关闭 1=IO端口C时钟开启 IOPBEN:IO端口B时钟使能, 0=IO端口B时钟关闭 1=IO端口B时钟开启 IOPAEN:IO端口B时钟使能, 0=IO端口A时钟关闭 1=IO端口A时钟开启 AFIOEN:辅助功能IO时钟使能, 0=辅助功能IO时钟关闭 1=辅助功能IO时钟开启 APB1外设时钟使能寄存器RCC->APB1ENR 32位寄存器(位数) 29 28 27 26 定义 DACEN PWREN BKPEN CAN2EN 25 22 21 20 19 CAN1EN I2C2EN I2C1EN UART5EN UART4EN 18 17 15 14 11 USART3EN USART2EN SPI3EN SPI2EN WWDGEN 5 4 3 2 1 TIM7EN TIM6EN TIM5EN TIM4EN TIM3EN 0 TIM2EN DACEN:DAC接口时钟使能, 0=DAC接口时钟关闭 1=DAC接口时钟开启 PWREN:电源接口时钟使能, 0=DAC接口时钟关闭 1=DAC接口时钟开启 BKPEN:备份接口时钟使能, 0=备份接口时钟关闭 1=备份接口时钟开启 CAN2EN:CAN2时钟使能, 0=CAN2时钟关闭 1=CAN2时钟开启 CAN1EN:CAN1时钟使能, 0=CAN1时钟关闭 1=CAN1时钟开启 I2C2EN:I2C2时钟使能, 0=I2C2时钟关闭 1=I2C2时钟开启 I2C1EN:I2C1时钟使能, 0=I2C1时钟关闭 1=I2C1时钟开启 UART5EN:UART5时钟使能, 0=UART5时钟关闭 1=UART5时钟开启 UART4EN:UART4时钟使能, 0=UART4时钟关闭 1=UART4时钟开启 USART3EN:USART3时钟使能, 0=USART3时钟关闭 1=USART3时钟开启 USART2EN:USART2时钟使能, 0=USART2时钟关闭 1=USART2时钟开启 SPI3EN:SPI3时钟使能, 0=SPI3时钟关闭 1=SPI3时钟开启 SPI2EN:SPI2时钟使能, 0=SPI2时钟关闭 1=SPI2时钟开启 WWDGEN:窗口看门狗时钟使能, 0=窗口看门狗时钟关闭 1=窗口看门狗时钟开启 TIM7EN:定时器7时钟使能, 0=定时器7时钟关闭 1=定时器7时钟开启 TIM6EN:定时器6时钟使能, 0=定时器6时钟关闭 1=定时器6时钟开启 TIM5EN:定时器5时钟使能, 0=定时器5时钟关闭 1=定时器5时钟开启 TIM4EN:定时器4时钟使能, 0=定时器4时钟关闭 1=定时器4时钟开启 TIM3EN:定时器3时钟使能, 0=定时器3时钟关闭 1=定时器3时钟开启 TIM2EN:定时器2时钟使能, 0=定时器2时钟关闭 1=定时器2时钟开启 IO端口寄存器 端口低配置寄存器GPIOX->CRL 32位寄存器(位数) 31:30 29:28 27:26 25:24 定义 CNF7[1:0] MODE7[1:0] CNF6[1:0] MODE6[1:0] 23:22 21:20 19:18 17:16 15:14 CNF5[1:0] MODE5[1:0] CNF4[1:0] MODE4[1:0] CNF3[1:0] 13:12 11:10 9:8 7:6 5:4 MODE3[1:0] CNF2[1:0] MODE2[1:0] CNF1[1:0] MODE1[1:0] 3:2 1:0 CNF0[1:0] MODE0[1:0] CNFx[1:0]: MODEx[1:0]=00 00=模拟输入模式, 01=浮空输入模式(复位) 10=上拉/下拉输入模式, 11=保留 MODEx[1:0]!=00 00=通用推挽输出模式, 01=通用开漏输出模式 10=复用功能推挽输出模式, 11=复用功能开漏输出模式 MODEx[1:0]: 00=输入模式(复位) 01=输出模式,最大速度10MHz 10=输出模式,最大速度2MHz 11=输出模式,最大速度50MHz 复位后,端口为浮空输入模式。 CRL和CRH一样,CRL设置IO端口低8位,CRH设置IO端口高8位 设置IO端口流程:先清除使用PIN的CNF和MODE,再设置该PIN的模式,若需要上拉/下拉,还需要设置端口输出数据寄存器ODR,置1上拉,置0下拉,读取ODR可以用于判断当前IO口的输出状态 端口输出数据寄存器GPIOx->ODR 32位寄存器(位数) 15 14 13 12 定义 ODR15 ODR14 ODR13 ODR12 11 10 9 8 7 ODR11 ODR10 ODR9 ODR8 ODR7 6 5 4 3 2 ODR6 ODR5 ODR4 ODR3 ODR2 1 0 ODR1 ODR0 要想知道某个PIN的状态,只需要读端口输入数据寄存器 端口输入数据寄存器GPIOx->IDR 32位寄存器(位数) 15 14 13 12 定义 IDR15 IDR14 IDR13 IDR12 11 10 9 8 7 IDR11 IDR10 IDR9 IDR8 IDR7 6 5 4 3 2 IDR6 IDR5 IDR4 IDR3 IDR2 1 0 IDR1 IDR0 例程: 端口初始化 void LED_Init(void) { RCC->APB2ENR|=1<<2; //使能 PORTA时钟 RCC->APB2ENR|=1<<5; //使能 PORTD时钟 GPIOA->CRH&=0XFFFFFFF0; GPIOA->CRH|=0X00000003;//PA8 推挽输出 GPIOA->ODR|=1<<8; //PA8 输出高 GPIOD->CRL&=0XFFFFF0FF; GPIOD->CRL|=0X00000300;//PD.2 推挽输出 GPIOD->ODR|=1<<2; //PD.2 输出高 } 定义输出引脚 #define PIN PAout(8)// PA8 另一种输出方法 #define PIN (1<<8) //PA8 #define PIN_SET(x) GPIOA->ODR=(GPIOA->ODR&~PIN)|(x ? PIN:0)//写PA8 定义输入引脚 #define PIN PAin(8) //PA8 另一种输入方法 #define PIN (1<<8) //PA8 #define PIN_GET() ((GPIOA->IDR&(PIN))?1:0)//读PA8 串口通信 串口设置流程: 1. 计算USART1->BRR: 波特率寄存器USART1->BRR 32位寄存器(位数) 15:4 3:0 定义 DIV_Mantissa[11:0] DIV_Fraction[3:0] DIV_Mantissa[11:0]:USARTDIV的整数部分,分频器除法因子的整数部分 DIV_Fraction[3:0]:USARTDIV的小数部分,分频器除法因子的小数部分 计算方法: temp = (float)(当前频率*1000000)/(baud*16) temp为float型, mantissa = temp;//整数部分保存给mantissa fraction = (temp-mantissa)*16;//小数部分转换成整数,保存给fraction mantissa <<=4;//整数部分左移4位,留给小数部分 mantissa +=fraction;//将小数部分加到整数部分低4位,合并 2. USART1使能 RCC->APB2ENR|=1<<2; //使能PORTA口时钟,PORTA.9为串口1的TX,PORTA.10 为串口2的RX RCC->APB2ENR|=1<<14; //使能串口时钟 3.配置PORTA.9(TX),PORTA.10(RX) GPIOA->CRH = 0x444444B4;//IO状态设置,PORTA.9模式:1011,复用功能推挽输 出模式,最大50MHz //PORTA.10模式:0100,浮空输入 4. 复位USART1 RCC->APB2RSTR|=1<<14; //开始复位串口1 RCC->APB2RSTR&=~(1<<14);//停止复位 5. 设置波特率 USART1->BRR=mantissa; 控制寄存器 1USART1->CR1 32位寄存器(位数) 13 12 11 10 定义 UE M WAKE PCE 9 8 7 6 5 PS PEIE TXEIE TCIE RXNE 4 3 2 1 0 IDLEIE TE RE RWU SBK UE:USART使能, 0=USART分频器和输出被禁止 1=USART模块使能 M:字长, 0=一个起始位,8个数据位,n个停止位 1=一个起始位,9个数据位,n个停止位 WAKE:唤醒的方法, 0=被空闲总线唤醒 1=被地址标记唤醒 PCE:检验控制使能, 0=禁止校验控制 1=使能校验控制 PS:校验选择,PCE使能后 0=偶校验 1=奇校验 PEIE:PE中断使能, 0=禁止产生中断 1=当USART_SR中的PE为‘1’时,产生 USART中断 TXEIE:发送缓冲区空中断使能, 0=禁止产生中断 1=当USART_SR中的TXE为‘1’时,产 生USART中断 TCIE:发送完成中断使能, 0=禁止产生中断 1=当USART_SR中的TC为‘1’时,产生 USART中断 RXNEIE:接收缓冲区非空中断使能, 0=禁止产生中断 1=当USART_SR中的ORE或者RXNE为‘1’ 时,产生USART中断 IDLEIE:IDLE中断使能, 0=禁止产生中断 1=当USART_SR中的IDLE为‘1’时,产 生USART中断 TE:发送使能, 0=禁止发送 1=使能发送 RE:接收使能, 0=禁止发送 1=使能发送 RWU:接收唤醒, 0=接收器处于正常工作模式 1=接收器处于静默模式 SBK:发送断开帧, 0=没有发送断开字符 1=将要发送断开字符 状态寄存器USART1->SR 32位寄存器(位数) 9 8 7 6 定义 CTS LBD TXE TC 5 4 3 2 1 RXNE IDLE ORE NE FE 0 PE CTS:CTS标志, 0=nCTS状态线上没有变化 1=nCTS状态线上发生变化 LBD:LIN断开检测标志 0=没有检测到LIN断开 1=检测到LIN断开 TXE:发送数据寄存器空, 0=数据还没有被转移到移位寄存器 1=数据已经被转移到移位寄存器 TC:发送完成, 0=发送未完成 1=发送完成 RXNE:读数据寄存器非空, 0=数据没有收到 1=收到数据,可以读出 6. 设置校验,停止位 USART1->CR1|=0X200C; //使能USART,TX,RX,一个起始位,8位数据,n个停止位,不校验 7. 允许接收设置 USART1->CR1|=1<<8; //PE中断使能 USART1->CR1|=1<<5; //接收缓冲区非空中断使能 MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级 8.串口发送数据 u8 temp; USART1->DR = temp; while(!(USART1->SR & (1<<6)));//检查TC为1继续 9.串口接收数据 u8 temp; 在串口中断USART1_IRQHandler(void)进行判断 if(USART1->SR & (1<<5))//检查RXNE为1继续 temp = USART->DR; 外部中断 1. 初始化IO口为输入 RCC->APB2ENR |= 1<<2; //使能PORTA时钟 JTAG_Set(JTAG_SWD_DISABLE); //关闭JTAG和SWD GPIOA->CRL &= 0xFFFFFFF0; //设置PA0为输入 GPIOA->CRL |= 0x00000008; GPIOA->CRH &= 0x0F0FFFFF; //设置PA0为输入 GPIOA->CRL |= 0x80800000; //设置PA13,PA15为输入 GPIOA->ODR |= 1<<13; //PA0默认下拉 GPIOA->ODR |= 1<<15; //PA13,PA15默认上拉 2. 配置中断分组(NVIC),并使能中断 外部中断配置寄存器EXTICR[4] 32位寄存器(位数) 15:12 11:8 7:4 3:0 定义 EXTI3[3:0] EXTI2[3:0] EXTI1[3:0] EXTI0[3:0] EXTIx[y]:引脚号与寄存器位编号对应设置对应的位置。例如,GPIOA.12,保存到EXTI3[0],计算方法,EXTI(12/4)[(12%4)*4]。 外部IO中断配置函数 void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) { u8 EXTADDR; u8 EXTOFFSET; EXTADDR=BITx/4; //得到中断寄存器组的编号 EXTOFFSET=(BITx%4)*4;//组内编号 RCC->APB2ENR|=0x01; //使能AFIOEN:辅助功能IO时钟使能 AFIO->EXTICR[EXTADDR]|=GPIOx<<EXTOFFSET; //EXTI.BITx映射到 GPIOx.BITx //自动设置 EXTI->IMR|=1<<BITx;// 开启 line BITx 上的中断 EXTI->EMR|=1<<BITx;//不屏蔽 line BITx 上的事件 if(TRIM&0x01)EXTI->FTSR|=1<<BITx;//line BITx 上事件下降沿触发 if(TRIM&0x02)EXTI->RTSR|=1<<BITx;//line BITx 上事件上升降沿触发 } Ex_NVIC_Config(GPIO_A,0,RTIR); Ex_NVIC_Config(GPIO_A,13,FTIR); Ex_NVIC_Config(GPIO_A,15,FTIR); 3. 编写中断函数 void EXTI0_IRQHandler(void) { delay_ms(10);//消抖 if(KEY2 == 1) //按键2 { LED0 =! LED0; LED1 =! LED1; } EXTI->PR = 1<<0; //清除LINE0上的中断标志位 } //外部中断15~10服务程序 void EXTI15_10_IRQHandler(void) { delay_ms(10); if(KEY0 == 0) { LED0 = !LED0; } else if(KEY1 == 0) { LED1 = !LED1; } EXTI->PR = 1<<13; //清除LINE13上的中断标志位 EXTI->PR = 1<<15; //清除LINE15上的中断标志位 } 看门狗 独立看门狗 独立看门狗的时钟在30KHz~60KHz之间变化 键寄存器IWDG_KR 32位寄存器(位数) 15:0 定义 KEY[15:0] 写入0xCCCC: 开始启用独立看门狗,计数器从重装载值递减计数(复位值 0xFFF),当计数器计数到末尾0x000时,会产生复位信号 (IWDG_RESET)。 写入0xAAAA: IWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位。 写入0x5555: 修改IWDG_PR和IWDG_RLR寄存器之前写入。 IWDG_PR和IWDG_RLR寄存器具有写保护功能,要修改,先向 IWDG_KR寄存器写入0x5555。修改完后,写入不同于0x5555的 值恢复写保护 分频寄存器IWDG_PR(7~0) 32位寄存器(位数) 2:0 定义 PR[2:0] PR[2:0]: 预分频因子 000:预分频因子=4 100:预分频因子=64 001:预分频因子=8 101:预分频因子=128 010:预分频因子=16 110:预分频因子=256 011:预分频因子=32 111:预分频因子=256 重装载寄存器IWDG_RLR(4095~0) 32位寄存器(位数) 11:0 定义 RL[11:0] RL[11:0]:看门狗计数器重装载值。 看门狗喂狗时间计算方法: Tout=((4×2^prer)×rlr)/40 Tout:看门狗溢出时间(ms) Prer:看门狗预分频值(IWDG_PR) Rlr:看门狗重装载值(IWDG_RLR) Prer=4,rlr=625,Tout=1000ms 例程: void IWDG_Init(u8 prer,u16 rlr) { IWDG->KR=0X5555;//使能对 IWDG->PR 和 IWDG->RLR 的写 IWDG->PR=prer; //设置分频系数 IWDG->RLR=rlr; //从加载寄存器 IWDG->RLR IWDG->KR=0XAAAA;//reload IWDG->KR=0XCCCC;//使能看门狗 } //喂独立看门狗 void IWDG_Feed(void) { IWDG->KR=0XAAAA;//reload } 窗口看门狗WWDG 窗口看门狗简单来说,就是有由一个上窗口值(0x7F~0x40)和一个下窗口值(0x40)组成的这个范围(窗口),窗口看门狗递减计数器WWDG_CR在这个窗口范围内(包括等于)刷新,否则就会产生复位,上窗口值是WWDG_CFR的低7位。 窗口看门狗超时公式: Twwdg=(4096×2^WDGTB×(T[5:0]+1))/Fpclk1; Twwdg:WWDG超时时间(ms) Fpclk1:APB1的时钟频率(KHz) WDGTB:WWDG的预分频系数 T[5:0]:窗口看门狗计数器低6位 假设Fpclk1=36MHz,最小-最大超时时间如表: WDGTB 最小超时值 最大超时值 0 113us 7.28ms 1 227us 14.56ms 2 455us 29.12ms 3 910us 58.25ms 控制寄存器(WWDG_CR) 32位寄存器(位数) 7 6:0 定义 WDGA T[6:0] WDGA:看门狗激活位,置1启动看门狗,只能硬件清零 T[6:0]:看门狗计数器值,每个PCLK1周期(4096×2^wdgtb)减1,当计数器的值从0x40变为0x3F的时候产生复位 配置寄存器(WWDG_CFR) 32位寄存器(位数) 9 8:7 6:0 定义 EWI WDGTB[1:0] W[6:0] EWI: 提前唤醒中断,1=当计数器达到40h,即产生中断,可以在不大于113us的时间内(PCLK1为36MHz的条件下)重写WWDG_CR,否则看门狗将产生复位 WDGTB[1:0]:时基,预分频器的时基 00=CK计时器时钟(PCLK1/4096)除以1 01=CK计时器时钟(PCLK1/4096)除以2 10=CK计时器时钟(PCLK1/4096)除以4 11=CK计时器时钟(PCLK1/4096)除以8 W[6:0]:7位窗口值 状态寄存器(WWDG_SR) 32位寄存器(位数) 0 定义 CISR CISR:软件置0=清除中断 流程: 使能WWDG时钟:IWDG有独立的40KHz时钟,WWDG使用PCLK1时钟,需要先使能· 时钟 设置WWDG_CFR和WWDG_CR两个寄存器:包括使能窗口看门狗,开启中断,设置 计数器的初始值,设置窗口值并设置分 频数WDGTB等。 u8 WWDG_CNT=0x7f; RCC->APB1ENR |= 1<<11; //使能WWDG时钟(PCLK1) WWDG_CNT = tr & WWDG_CNT; //初始化WWDG_CNT WWDG->CFR |= fprer<<7; //(PCLK1/4096)/2^fprer, WWDG->CFR |=1<<9; //使能中断EWI WWDG->CFR&=0XFF80; //低7位清零 WWDG->CFR|=wr;
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服