收藏 分享(赏)

STM编程心得.doc

上传人:hwpkd79526 文档编号:7464607 上传时间:2019-05-19 格式:DOC 页数:23 大小:1.31MB
下载 相关 举报
STM编程心得.doc_第1页
第1页 / 共23页
STM编程心得.doc_第2页
第2页 / 共23页
STM编程心得.doc_第3页
第3页 / 共23页
STM编程心得.doc_第4页
第4页 / 共23页
STM编程心得.doc_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、STM编程心得一.Keil 的设置:1.添加目录:选择 Options for Target Target1选择 Include Paths,添加项目包含的目录2.程序编写:初始化时钟RCC-RC时钟控制寄存器定义32位寄存器(位数) 25 24 19 18定义 PLLRDY PLLON CSSON HSEBYP17 16 15:8 7:3 1 0HSERDY HSEON HSICAL7:0 HSITRIM4:0 HSIRDY HSIONPLLRDY:PLL 时钟就绪标志,PLL 锁定后由硬件置 1,0=PLL 未锁定,1=PLL 锁定。PLLON:PLL 使能,当进入待机和停止模式时,硬件清

2、零。当 PLL时钟作为系统时钟时,该位不能被清零0=PLL关闭,1=PLL 使能。CSSON:时钟安全系统使能,0=时钟检测器关闭,1=如果外部 4-16MHz振荡器就绪,时钟检测器开启。HSERDY:外部告诉时钟就绪标志,0=外部 4-16MHz振荡器没就绪,1=外部 4-16MHz 振荡器就绪。HSEON:外部高速时钟使能,当进入待机和停止模式时,硬件清零。当 4-16MHz振荡器作为系统时钟时,该位不能被清零0=HSE振荡器关闭,1=HSE 振荡器开启。HSICAL7:0:内部高速时钟校准。系统启动初始化HSITRIM4:0:内部高速时钟调整,默认 16,可以把 HSI调整到 8MHz1

3、%,每步 HSICAL变化调整越 40kHz。HSIRDY:内部高速时钟就绪标志,0=内部 8MHz振荡器没就绪,1=内部 8MHz振荡 器就绪。HSION:内部高速时钟使能,当内部 8MHz振荡器被直接或间接地用作或被选择将 要作为系统时钟时,该位不能被清零。0=内部 8MHz振荡器关闭,1=内部 8MHz振荡器开启。时钟配置寄存器 RCC-CFGR32位寄存器(位数) 26:24 22 21:18 17定义 MCO2:0 USBPRE PLLMUL3:0 PLLXTPRE16 15:14 13:11 10:8 7:4PLLSRC ADCPRE1:0 PPRE22:0 PPRE12:0 HP

4、RE3:03:2 1:0SWS1:0 SW1:0MCO2: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=

5、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输入时钟ADCPRE1:0:ADC 预分频,00=PCLK2 2 分频后作为 ADC时钟,01=PCLK2 4分频后作为 ADC时钟,10=PCLK2 6分频后作为 ADC时钟,11=

6、PCLK2 8分频后作为 ADC时钟。PPRE22:0:高速 APB预分频(APB2),0XX=HCLK 不分频100=HCLK 2分频101=HCLK 4 分频110=HCLK 8 分频111=HCLK 16分频PPRE12:0:低速 APB预分频(APB1),0XX=HCLK 不分频 100=HCLK 2分频101=HCLK 4 分频110=HCLK 8 分频111=HCLK 16分频HPRE3:0:AHB预分频,0XXX=SYSCLK 不分频1000=SYSCLK 2 分频1001=SYSCLK 4 分频1010=SYSCLK 8 分频1011=SYSCLK 16 分频1100=SYSC

7、LK 64 分频1101=SYSCLK 128 分频1110=SYSCLK 256 分频1111=SYSCLK 512 分频SWS1:0:系统时钟切换状态,00=HSI 作为系统时钟01=HSE作为系统时钟10=PLL输出系统时钟11=不可用SW1:0:系统时钟切换,00=HSI 作为系统时钟01=HSE作为系统时钟10=PLL输出作为系统时钟11=不可用 例程:Void Stm32_Clock_Init(u8 PLL)unsigned char temp = 0;MYRCC_DeInit();RCC-CR |= 0x00010000;/外部高速时钟使能 HSEON=1While(!(RCC-

8、CR17);/将 HSEON右移 17位,等 HSERDY=1(外部时钟就绪)RCC-CFGR = 0x00000400;/APB1/2 = DIV2;AHB =DIV1;PLL -= 2;/和寄存器设定值相差 2个单位;RCC-CFGR |= PLLCFGR |= 1ACR |= 0x32; /FLASH 2个延时周期RCC-CR |= 0x01000000; /PLLONWhile(!(RCC-CR25) /等待 PLL锁定RCC-CFGR |= 0x00000002;/PLL作为系统时钟 SW=0x10While(temp != 0x02) /等待 PLL作为系统时钟设置成功 SWS是否

9、 0x10temp = RCC-CFGR2;temp 延时函数SysTick-CTRL系统时钟控制寄存器定义:32位寄存器(位数) 16 2 1 0定义 COUNTFLAG CLKSOURCE TICKINT ENABLECOUNTFLAG:如果在上次读取本寄存器后,SysTick 已经数到了 0,则该位置1。如果读取该位将自动清零。CLKSOURCE:0=外部时钟源(STCLK)1=内核时钟(FCLK) 。TICKINT:1=SysTick 倒数到 0时产生 SysTick异常请求0=数到 0时无动作ENABLE:SysTick 定时器的使能位SysTick-LOAD系统时钟重载寄存器定义3

10、2位寄存器(位数) 23:0定义 RELOADRELOAD:当倒数至 0时,将被重装载的值。SysTick-VAL系统时钟当前值寄存器定义32位寄存器(位数) 23:0定义 CURRENTCURRENT:读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick控制及状态寄存器中的 COUNTFLAG标志。例程:void delay_init(u8 SYSCLK)SysTick-CTRL/CLKSOURCE=0,选择外部时钟源。fac_us=SYSCLK/8; /系统时钟 SYSCLK=fac_ms=(u16)fac_us*1000;void delay_ms(u16 nms)u3

11、2 temp; SysTick-LOAD=(u32)nms*fac_ms;/时间加载(SysTick-LOAD 为 24bit)SysTick-VAL =0x00; /清空计数器,不需要重载SysTick-CTRL=0x01 ; /开始倒数 dotemp=SysTick-CTRL; /不停读取 CTRL,检查 COUNTFLAGwhile(temp /关闭计数器SysTick-VAL =0X00; /清空计数器,不需要重载void delay_us(u32 nus)u32 temp; SysTick-LOAD=nus*fac_us; /时间加载 SysTick-VAL=0x00; /清空计数器

12、SysTick-CTRL=0x01 ; /开始倒数 dotemp=SysTick-CTRL;while(temp /关闭计数器SysTick-VAL =0X00; /清空计数器 外设时钟控制AHB外设时钟使能寄存器 RCC-AHBENR32位寄存器(位数) 16 15 14 12定义 ETHMACRXEN ETHMACTXEN ETHMACEN OTGFSEN6 4 2 1 0CRCEN FLITFEN SRAMEN DMA2EN DMA1ENETHMACRXEN:以太网 MAC接收时钟使能, 0=以太网 MAC接收时钟关闭1=以太网 MAC接收时钟开启ETHMACTXEN:以太网 MAC发送

13、时钟使能, 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

14、=DMA2时钟开启DMA1EN:DMA1 时钟使能, 0=DMA1时钟关闭1=DMA1时钟开启APB2外设时钟使能寄存器 RCC-APB2ENR32位寄存器(位数) 14 12 11 10定义 USART1EN SPI1EN TIM1EN ADC2EN9 6 5 4 3ADC1EN IOPEEN IOPDEN IOPCEN IOPBEN2 0IOPAEN AFIOENUSART1EN:USART1 时钟使能, 0=USART1时钟关闭1=USART1时钟开启SPI1EN:SPI1 时钟使能, 0=SPI1时钟关闭1=SPI1时钟开启TIM1EN:TIM1 定时器时钟使能, 0=TIM1定时器时

15、钟关闭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时钟使能,

16、0=IO端口 A时钟关闭1=IO端口 A时钟开启AFIOEN:辅助功能 IO时钟使能, 0=辅助功能 IO时钟关闭1=辅助功能 IO时钟开启APB1外设时钟使能寄存器 RCC-APB1ENR32位寄存器(位数) 29 28 27 26定义 DACEN PWREN BKPEN CAN2EN25 22 21 20 19CAN1EN I2C2EN I2C1EN UART5EN UART4EN18 17 15 14 11USART3EN USART2EN SPI3EN SPI2EN WWDGEN5 4 3 2 1TIM7EN TIM6EN TIM5EN TIM4EN TIM3EN0TIM2ENDACE

17、N: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

18、时钟开启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

19、:定时器 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-CRL32位寄存器(位数) 31:30 29:28 27:26 25:24定义 CNF71:0 MODE71:0 CNF61:0 MODE61:023:22 21:20

20、 19:18 17:16 15:14CNF51:0 MODE51:0 CNF41:0 MODE41:0 CNF31:013:12 11:10 9:8 7:6 5:4MODE31:0 CNF21:0 MODE21:0 CNF11:0 MODE11:03:2 1:0CNF01:0 MODE01:0CNFx1:0: MODEx1:0=0000=模拟输入模式, 01=浮空输入模式(复位)10=上拉/下拉输入模式, 11=保留MODEx1:0!=0000=通用推挽输出模式, 01=通用开漏输出模式10=复用功能推挽输出模式, 11=复用功能开漏输出模式MODEx1:0: 00=输入模式(复位) 01=输

21、出模式,最大速度 10MHz10=输出模式,最大速度 2MHz 11=输出模式,最大速度 50MHz复位后,端口为浮空输入模式。CRL和 CRH一样,CRL 设置 IO端口低 8位,CRH 设置 IO端口高 8位设置 IO端口流程:先清除使用 PIN的 CNF和 MODE,再设置该 PIN的模式,若需要上拉/下拉,还需要设置端口输出数据寄存器 ODR,置 1上拉,置 0下拉,读取 ODR可以用于判断当前 IO口的输出状态端口输出数据寄存器 GPIOx-ODR32位寄存器(位数) 15 14 13 12定义 ODR15 ODR14 ODR13 ODR1211 10 9 8 7ODR11 ODR1

22、0 ODR9 ODR8 ODR76 5 4 3 2ODR6 ODR5 ODR4 ODR3 ODR21 0ODR1 ODR0要想知道某个 PIN的状态,只需要读端口输入数据寄存器端口输入数据寄存器 GPIOx-IDR32位寄存器(位数) 15 14 13 12定义 IDR15 IDR14 IDR13 IDR1211 10 9 8 7IDR11 IDR10 IDR9 IDR8 IDR76 5 4 3 2IDR6 IDR5 IDR4 IDR3 IDR21 0IDR1 IDR0例程:端口初始化void LED_Init(void) RCC-APB2ENR|=1APB2ENR|=1CRH GPIOA-C

23、RH|=0X00000003;/PA8 推挽输出 GPIOA-ODR|=1CRL GPIOD-CRL|=0X00000300;/PD.2 推挽输出 GPIOD-ODR|=1ODR=(GPIOA-ODR/整数部分保存给 mantissafraction = (temp-mantissa)*16;/小数部分转换成整数,保存给 fractionmantissa APB2ENR|=1APB2ENR|=1CRH = 0x444444B4;/IO状态设置,PORTA.9 模式:1011,复用功能推挽输出模式,最大 50MHz/PORTA.10模式:0100,浮空输入 4.复位 USART1RCC-APB2

24、RSTR|=1APB2RSTR控制寄存器 1USART1-CR132位寄存器(位数) 13 12 11 10定义 UE M WAKE PCE9 8 7 6 5PS PEIE TXEIE TCIE RXNE4 3 2 1 0IDLEIE TE RE RWU SBKUE:USART 使能, 0=USART分频器和输出被禁止1=USART模块使能M:字长, 0=一个起始位,8 个数据位,n 个停止位1=一个起始位,9 个数据位,n 个停止位WAKE:唤醒的方法, 0=被空闲总线唤醒1=被地址标记唤醒PCE:检验控制使能, 0=禁止校验控制1=使能校验控制PS:校验选择,PCE 使能后 0=偶校验1=

25、奇校验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:发

26、送使能, 0=禁止发送1=使能发送RE:接收使能, 0=禁止发送1=使能发送RWU:接收唤醒, 0=接收器处于正常工作模式1=接收器处于静默模式SBK:发送断开帧, 0=没有发送断开字符1=将要发送断开字符状态寄存器 USART1-SR32位寄存器(位数) 9 8 7 6定义 CTS LBD TXE TC5 4 3 2 1RXNE IDLE ORE NE FE0PECTS:CTS 标志, 0=nCTS状态线上没有变化1=nCTS状态线上发生变化LBD:LIN 断开检测标志 0=没有检测到 LIN断开1=检测到 LIN断开TXE:发送数据寄存器空, 0=数据还没有被转移到移位寄存器1=数据已经被

27、转移到移位寄存器TC:发送完成, 0=发送未完成1=发送完成RXNE:读数据寄存器非空, 0=数据没有收到1=收到数据,可以读出6.设置校验,停止位USART1-CR1|=0X200C; /使能 USART,TX,RX,一个起始位,8 位数据,n 个停止位,不校验 7.允许接收设置USART1-CR1|=1CR1|=1DR = temp;while(!(USART1-SR 外部中断1.初始化 IO口为输入RCC-APB2ENR |= 1CRL /设置 PA0为输入GPIOA-CRL |= 0x00000008;GPIOA-CRH /设置 PA0为输入GPIOA-CRL |= 0x8080000

28、0; /设置 PA13,PA15为输入GPIOA-ODR |= 1ODR |= 1APB2ENR|=0x01; /使能 AFIOEN:辅助功能 IO时钟使能 AFIO-EXTICREXTADDR|=GPIOxIMR|=1EMR|=1FTSR|=1RTSR|=1PR = 1PR = 1PR = 1KR=0X5555;/使能对 IWDG-PR 和 IWDG-RLR 的写 IWDG-PR=prer; /设置分频系数 IWDG-RLR=rlr; /从加载寄存器 IWDG-RLR IWDG-KR=0XAAAA;/reload IWDG-KR=0XCCCC;/使能看门狗 /喂独立看门狗 void IWDG

29、_Feed(void) IWDG-KR=0XAAAA;/reload 窗口看门狗 WWDG窗口看门狗简单来说,就是有由一个上窗口值(0x7F0x40)和一个下窗口值(0x40)组成的这个范围(窗口) ,窗口看门狗递减计数器 WWDG_CR在这个窗口范围内(包括等于)刷新,否则就会产生复位,上窗口值是 WWDG_CFR的低 7位。窗口看门狗超时公式:Twwdg=(40962WDGTB(T5:0+1) )/Fpclk1;Twwdg:WWDG 超时时间(ms)Fpclk1:APB1 的时钟频率(KHz)WDGTB:WWDG 的预分频系数T5:0:窗口看门狗计数器低 6位假设 Fpclk1=36MHz

30、,最小-最大超时时间如表:WDGTB 最小超时值 最大超时值0 113us 7.28ms1 227us 14.56ms2 455us 29.12ms3 910us 58.25ms控制寄存器(WWDG_CR)32位寄存器(位数) 7 6:0定义 WDGA T6:0WDGA:看门狗激活位,置 1启动看门狗,只能硬件清零T6:0:看门狗计数器值,每个 PCLK1周期(40962wdgtb)减 1,当计数器的值从 0x40变为 0x3F的时候产生复位配置寄存器(WWDG_CFR)32位寄存器(位数) 9 8:7 6:0定义 EWI WDGTB1:0 W6:0EWI: 提前唤醒中断,1=当计数器达到 4

31、0h,即产生中断,可以在不大于 113us的时间内(PCLK1 为 36MHz的条件下)重写 WWDG_CR,否则看门狗将产生复位WDGTB1:0:时基,预分频器的时基00=CK计时器时钟(PCLK1/4096)除以 101=CK计时器时钟(PCLK1/4096)除以 210=CK计时器时钟(PCLK1/4096)除以 411=CK计时器时钟(PCLK1/4096)除以 8W6:0:7 位窗口值状态寄存器(WWDG_SR)32位寄存器(位数) 0定义 CISRCISR:软件置 0=清除中断流程:使能 WWDG时钟:IWDG 有独立的 40KHz时钟,WWDG 使用 PCLK1时钟,需要先使能

32、时钟设置 WWDG_CFR和 WWDG_CR两个寄存器:包括使能窗口看门狗,开启中断,设置计数器的初始值,设置窗口值并设置分频数 WDGTB等。u8 WWDG_CNT=0x7f;RCC-APB1ENR |= 1CFR |= fprerCFR |=1CFR /低 7位清零 WWDG-CFR|=wr; /设定窗口值 WWDG-CR|=WWDG_CNT|(1CFR/重置窗口值 tr=WWDG-CR/重置计数值 if(trSR=0X00;/清除提前唤醒中断标志位 LED1=!LED1; 通用定时器 TIMx(TIM2,TIM3,TIM4,TIM5)控制寄存器 1TIMx_CR132位寄存器(位数) 9

33、:8 7 6:5 4定义 CKD1:0 ARPE CMS1:0 DIR3 2 1 0OPM URS UDIS CENCKD1:0:时钟分频因子00:tDTS = tCK_INT01:tDTS = 2tCK_INT10:tDTS = 4tCK_INTARPE:自动重装载预装载允许位 0=TIMx_ARR寄存器没有缓冲1=TIMx_ARR寄存器被装入缓冲器CMS1:0:选择中央对齐模式 00:边沿对齐模式01:中央对齐模式 110:中央对齐模式 211:中央对齐模式 3DIR:方向,0=向上计数,1=向下计数OPM:单脉冲模式,0=在发生更新事件时,计数器不停止1=在发生下一次更新事件(清除 CE

34、N位)时,计数器停止URS:更新请求源,选择 UEV事件的源,0 和 1事件上有区别0=计数器溢出/下溢,设置 UG位,从模式控制器产生的更新1=计数器溢出/下溢才产生更新中断或 DMA请求。UDIS:禁止更新,允许/禁止 UEV事件的产生,0=允许 UEV,更新由计数器溢出/下溢,设置 UG位,从模式控制器产生的更新产生1=禁止 UEVCEN:使能计数器, 0=禁止,1=使能单脉冲模式下,当发生更新事件时,CEN 被自动清除DMA/中断使能寄存器 TIMx_DIER32位寄存器(位数) 14 12 11 10定义 TDE CC4DE CC3DE CC2DE9 8 6 4 3CC1DE UDE

35、 TIE CC4IE CC3IE2 1 0CC2IE CC1IE UIE关心第 6位和第 0位TIE:触发中断使能位,TIMx 需要使用中断,该位必须为 1UIE:允许更新中断使能位,1=允许由更新事件而产生的中断预分频寄存器 TIMx_PSC32位寄存器(位数) 15:0定义 PSC15:0PSC15:0:预分频器的值计时器的时钟频率 CK_CNT = Fck_psc/(PSC15:0+1)时钟来源:1)内部时钟(CK_INT)2)外部时钟模式 1:外部输入脚(TIx)3)外部时钟模式 2:外部触发输入(ETR)4)内部触发输入(ITRx):使用 A定时器作为 B定时器的分频器。通过 TIM

36、x_SMCR寄存器来确定时钟来源,CK_INT 时钟是从 APB1倍频得来的,除非 APB1的时钟分频数设置为 1,否则 TIMx的时钟是 APB1的 2倍,APB1 的时钟不分频的时候,通用定时器 TIMx写的时钟就等于 APB1的时钟,高级定时器的时钟来自 APB2。状态寄存器 TIMx_ SR32位寄存器(位数) 12 11 10 9定义 CC4OF CC3OF CC2OF CC1OF6 4 3 2 1TIF CC4IF CC3IF CC2IF CC1IF0UIFCCxOF:捕获/比较 x重复捕获标记TIF:触发器中断标记CCxIF:捕获/比较 x中断标记UIF:更新中断标记例程:/通用

37、定时器中断初始化 /这里始终选择为 APB1 的 2 倍,而 APB1 为 36M /arr:自动重装值。 /psc:时钟预分频数 /这里使用的是定时器 3! void Timerx_Init(u16 arr,u16 psc) RCC-APB1ENR|=1ARR=arr; /设定计数器自动重装值/刚好 1ms TIM3-PSC=psc; /预分频器 7200,得到 10Khz 的计数时钟 /这两个东东要同时设置才可以使用中断 TIM3-DIER|=1DIER|=1CR1|=0x01; /使能定时器 3 MY_NVIC_Init(1,3,TIM3_IRQChannel,2);/抢占 1,子优先级

38、 3,组 2 中断服务程序void TIM3_IRQHandler(void) if(TIM3-SR TIM3-SR&=(1TIMx_CCR1时通道 1为无效电平,否则为有效电平。111:PWM 模式 2-向下计数时,一旦 TIMx_CNTTIMx_CCR1时通道 1为有效电平,否则为无效电平。使用 PWM模式,所以这 3位必须设置为 110/111。捕获/比较使能寄存器 TIMx_CCER32位寄存器(位数) 13 12 9 8定义 CC4P CC4E CC3P CC3E5 4 1 0CC2P CC2E CC1P CC1E捕获/比较寄存器 TIMx_CCR1432位寄存器(位数) 15:0定

39、义 CCR115:0若 CC1通道配置为输出:CCR1包含了装入当前捕获/比较 1寄存器的值如果在 TIMx_CCMR1寄存器中为选择预装载特性,写入数值会立即传输至当前寄存器中。否则只有当更新事件发生时,此预装载值才传输至当前捕获/比较 1寄存器中。若 CC1通道配置为输入:CCR1包含了由上一次输入捕获 1事件传输的计数器值。1)使能 TIM32)设置引脚3)TIM3-ARR 设定计数器自动重装值4)TIM3-PSC 设置预分频不分频5)TIM3-CCMR1 CH2 设置 PWM2模式6)TIM3-CCMR1 CH2 预装载使能7)TIM3-CCER OC2 输出使能8)TIM3-CR1

40、ARPE 使能9)TIM3-CR1 使能定时器 3OLED控制8080信号线CS:TFTLCD 片选WR:向 TFTLCD写入数据RD:从 TFTLCD读取数据D15:0:16 位双向数据线RST:硬复位,直接接到 STM32的复位脚上DC:0=读写命令,1=读写数据8080读/写过程:根据写入/读取的数据类型,设置 DC为高(数据)/低(命令) ,拉低片选 CS,选中 SSD1306,接着我们根据是读数据,还是写数据置 RD/WR。RD上升沿:数据锁存到数据线 D7:0上WR上升沿:数据写入到 SSD1306里面如果使用 RD,将 WR拉高,反之,使用 WR,将 RD拉高有时候(读显存的时候

41、) ,需要一个假读命令,使微控制器的操作频率和显存的操作频率相匹配,第一个读到的字节丢弃不要,从第二个开始,才是我们真正要读的数据。SPI读写过程:CS:OLED 片选信号RST:硬复位 OLEDDC:0=读写命令,1=读写数据SCLK:串行时钟线SDIN:串行数据线D2悬空,其他 GND,只能往模块写数据而不能读数据SPI流程:SCLK 上升沿,SDIN 移入,高位在前扫描:有 64行,128 列,每个点一个字节;每 8行一页,一共 8页。在能读的模式下,先读出要写入的那个字节,得到当前状况,在修改了要写的位之后再写进 GRAM。采用一种方法:在 STM32内部建立一个 OLED的 GRAM

42、一共 128字节,在每次修改的时候,只修改 STM32上的 GRAM(实际上是 SRAM) ,一次性把 STM32上的GRAM写入到 OLED的 GRAM,对于 SRAM小的单片机就比较麻烦SSD1306命令较多指令 各位描述HEX D7 D6 D5 D4 D3 D2 D1 D0命令 说明81 1 0 0 0 0 0 0 1A7:0 A7 A6 A5 A4 A3 A2 A1 A0设置对比度A的值越大,屏幕越亮,A 的范围00FFAE/AF 1 0 1 0 1 1 1 X0 设置显示开关X0=0,关闭显示X0=1,开启显示8D 1 0 0 0 1 1 0 1A7:0 * * 0 1 0 A2 0

43、 0电荷泵设置A2=0,关闭电荷泵A2=1,开启电荷泵B0B7 1 0 1 1 0 X2 X1 X0 页地址 X2:0=07对应页000F 0 0 0 0 X3 X2 X1 X0 列地址低48位起始列地址低4101F 0 0 0 0 X3 X2 X1 X0 列地址高48位起始列地址高4启动流程:1.复位 SSD1306,RST=0,delay_ms(10),RST=1;2.驱动 IC初始化代码,建议复位所有寄存器3.开启显示4.清 0显存5.开始显示IO口连接OLED_CS对应 PC9OLED_RS对应 PC8OLED_WR对应 PC7OLED_RD对应 PC6OLED_D7:0对应 PB7:0LCD控制CS:TFTLCD 片选WR:向 TFTLCD写入数据RD:从 TFTLCD读取数据D15:0:16 位双向数据线RST:硬复位,直接接到 STM32的复位脚上RS:0=读写命令,1=读写数据实时时钟 RTC备份寄存器 BKP_DR132位寄存器(位数) 15:0定义 备份

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报