STM32学习笔记(寄存器版本)_第1页
STM32学习笔记(寄存器版本)_第2页
STM32学习笔记(寄存器版本)_第3页
STM32学习笔记(寄存器版本)_第4页
STM32学习笔记(寄存器版本)_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、 GPIO 口的配置STM32的 DGPIO 口最多可以有 7组(GPIOaGPIOg , 而每一组 GPIO 口均有 16个 双向 IO 组成。并且没个 IO 口均可配置成 8种模式(4种输入模式, 4种输出模式 。不管 配置哪个 IO 口也不论将其配置成哪种模式(但是配置成哪种模式要看具体应用,参考中 文参考手册第 105页都可以按以下步骤来进行配置:(1使能 PORTx (x=AG时钟这里就得操作寄存器 RCC_APB2ENR(32为寄存器了 RCC_APB2ENR的 015位(0632位保留第 28分别是使能 GPIOAGPIOG时钟的,只要将其置“ 1”即可,如RCC_APB2E

2、NR|=1<<2;就是使能 GPIOA 的时钟;其余 IO 口的始终使能一次类推 。 GPIOx_CRL(x=AG(端口配置低寄存器 x=A E该寄存器用于配置 GPIOx 的低 8位,具体 8种模式的配置见中文参考手册例如: GPIOD->CRL&=0XFFFFF0FF; GPIOD->CRL|=0X00000300; /PD.2推挽输出;其余 IO 口的 GPIOx_CRH(端口配置高寄存器 x=A E该寄存器用于配置 GPIOx 的高 8位,具体 8种模式的配置见中文参考手册例如: GPIOA->CRH&=0XFFFFFFF0; GPIOA-

3、>CRH|=0X00000003; /PA8 推挽输出;其余 IO 口 的高 8位以此类推。 GPIOx_IDR(端口输入数据寄存器 x=A E GPIOx_ODR(端口输出数据寄存器 x=A E 该寄存器配置 IO 口的 015位的输入初始状态, 例如:GPIOA->ODR|=1<<13; /PA13上拉 输入一般 GPIO 口配置可仿以下两个程序:void KEY_Init(voidRCC->APB2ENR|=1<<2; /使能 PORTA 时钟GPIOA->CRL&=0XFFFFFFF0;/PA0设置成输入GPIOA->CRL

4、|=0X00000008;GPIOA->CRH&=0X0F0FFFFF;/PA13,15设置成输入GPIOA->CRH|=0X80800000;GPIOA->ODR|=1<<13; /PA13上拉 ,PA0默认下拉GPIOA->ODR|=1<<15; /PA15上拉void LED_Init(voidRCC->APB2ENR|=1<<2; /使能 PORTA 时钟RCC->APB2ENR|=1<<5; /使能 PORTD 时钟GPIOA->CRH&=0XFFFFFFF0;GPIOA->

5、;CRH|=0X00000003;/PA8 推挽输出GPIOA->ODR|=1<<8; /PA8 输出高GPIOD->CRL&=0XFFFFF0FF;GPIOD->CRL|=0X00000300;/PD.2推挽输出GPIOD->ODR|=1<<2; /PD.2输出高二、串口通信STM32最多可以提供 5路串口,其串口配置主要有以下步骤:(1串口时钟使能 RCC_APB2ENR的 015位(1632位保留在寄存器 RCC_APB2ENR里的第 14位就是对串口 1的时钟使能即:RCC_APB2ENR|=1<<14; /使能串口

6、1时钟 , 那么除串口 1的时钟使能在 RCC_APB2ENR外其余的时钟使能位在寄存器 RCC_APB1ENR里,看下表: RCC_APB1ENR例如:RCC_APB1ENR|=1<<17; /使能串口 2时钟 ,其余串口时钟使能以此类推。(2串口复位即结束复位STM32在使用串口时不管当前该串口出于什么状态都先要将其复位,而复位后要将其 RCC_APB2RSTR(APB2外设复位寄存器寄存器 RCC_APB2RSTR的第 14位是进行串口 1的复位如:RCC_APB1RSTR|=1<<14; /将 串口 1复位 ,然后结束复位 RCC_APB1RSTR|=(1<

7、;<14 ; /结束串口 1复位其余串口复位在寄存器 RCC_APB1RSTR里如下表: RCC_APB1RSTR(APB1外设复位寄存器如:RCC_APB1RSTR|=1<<17; /复位串口 2 RCC_APB1RSTR|=(1<<17; / 结束串 口 2复位 ,其余串口复位操作以此类推。 USART_BRR(波特比率寄存器该寄存器的 15-4位:DIV_Mantissa11:0USARTDIV的整数部分,这 12位定义了 USART 分频器除法因子 (USARTDIV的整数部分; 3-0位:DIV_Fraction3:0USARTDIV的 小数部分,这 4

8、位定义了 USART 分频器除法因子 (USARTDIV的小数部分。关于波特率设 置在函数void uart_init(u32 pclk2,u32 bound里已经设置好, 并且封装在 usart.c 文件里面可以直接调用。 (4串口控制 USART_CR1(控制寄存器 1该寄存器 3214位保留, 第 13位使能串口 (任何串口在应用的时候都必需将其置 “ 1” 第 12位设置字长,当这位为“ 0” 的时候设置串口位 8个字长外加 n 个停止位, 这 n 个停止 位在寄存器 USART_CR2中第 13:12位来决定。 PCE 为奇偶校验使能位设置为“ 0”则禁止 校验,否则使能校验。 PS

9、 是交验选择位,设置为“ 0”则为偶校验,否则为奇校验。 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

10、中的 ORE 或者 RXNE 为 1时,产生 USART 中断 。 TE 为发送使能位,设置为“ 1”将开启串口的发送功能。 RE 为接收使能位,用法同 TE 。 USART_CR2(控制寄存器 2如:USART1->CR1|=0X200C; /1位停止 , 无校验位 . 0X200C=0010 0000 0000 1100B 设置成使能串口 8个字长 1个停止位(USART_CR2中 13:12默认为“ 0” 禁止校验,禁止 校验所有中断,使能发送和接收。 (5数据发送和接收 USART_DR(数据寄存器 发送数据缓存寄存器(向它写数据它会自动发送数据,当接收到数据时则存放接收的数据

11、(6串口控制 USART_SR 参考程序:void uart_init(u32 pclk2,u32 bound float temp; u16 mantissa; u16 fraction; temp=(float(pclk2*1000000/(bound*16;/得到 USARTDIV mantissa=temp; /得到整数部分 fraction=(temp-mantissa*16; /得到小数部分 mantissa<<=4; mantissa+=fraction; RCC->APB2ENR|=1<<2; /使能 PORTA 口时钟 RCC->APB2E

12、NR|=1<<14; /使能串口时钟 GPIOA->CRH&=0XFFFFF00F; GPIOA->CRH|=0X000008B0;/IO状态设置 RCC->APB2RSTR|=1<<14; /复位串口 1 RCC->APB2RSTR&=(1<<14;/停止复位/波特率设置USART1->BRR=mantissa; / 波特率设置USART1->CR1|=0X200C; /1位停止 , 无校验位 .#ifdef EN_USART1_RX /如果使能了接收/使能接收中断USART1->CR1|=1<

13、;<8; /PE中断使能USART1->CR1|=1<<5; /接收缓冲区非空中断使能MY_NVIC_Init(3,3,USART1_IRQChannel,2;/组 2,最低优先级 #endifvoid USART1_IRQHandler(voidu8 res;if(USART1->SR&(1<<5/接收到数据res=USART1->DR;if(USART_RX_STA&0x80=0/接收未完成if(USART_RX_STA&0x40/接收到了 0x0dif(res!=0x0aUSART_RX_STA=0;/接收错误 ,

14、重新开始 else USART_RX_STA|=0x80; /接收完成了else /还没收到 0X0Dif(res=0x0dUSART_RX_STA|=0x40;elseUSART_RX_BUFUSART_RX_STA&0X3F=res; USART_RX_STA+;if(USART_RX_STA>63USART_RX_STA=0;/接 收数据错误 , 重新开始接收以上两个函数已经封装在 usart.c 中可直接调用三、外部中断STM32的每一个 IO 口都可以作为中断输入, 要想把 IO 口作为中断输入则必须将 IO 口 设置成上拉 /下拉输入或浮空输入(设置成浮空输入时要接上

15、拉或下拉电阻否则可能导致中 断不断触发 。下面总结一下设置 IO 口为外部中断时的步骤:(1将 IO 口设置成输入模式这个在第一章总结过,这里不多说。(2开启 IO 口复用时钟,设置 IO 口与中断线的映射关系这一步在函数 void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM 中已经封装好可直接调用 这里说一下 IO 口的复用时钟使能: RCC_APB2ENRRCC_APB2ENR|=0X01; /使能 IO 口复用时钟(3开启与该 IO 口相对应的线上中断 /事件,并设置触发条件这一步封装在函数 void Ex_NVIC_Config(u8 GPIOx,u

16、8 BITx,u8 TRIM 中,可以直接调 用,例如:Ex_NVIC_Config(GPIO_A,0,RTIR; /设置 PA (0上升沿触发Ex_NVIC_Config(GPIO_A,13,FTIR;/设置 PA (13下降沿触发(4配置中断分组(NVIC 并使能中断这一步封装在函数 void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group 里面可以直接调用,例如:MY_NVIC_Init(2,2,EXTI0_IRQChannel,2; /抢占 2,子优先级

17、2,组 2这里值得注意的是 EXTI0、 EXTI1、 EXTI2、 EXTI3、 EXTI4为 Line0Line4EXTI15_10为 Line15Line10 EXTI9_5为 Line9Line5(5编写中断服务函数例如:void EXTI15_10_IRQHandler(voiddelay_ms(10; /消抖if(KEY0=0 /按键 0LED0=!LED0;else if(KEY1=0/按键 1LED1=!LED1;EXTI->PR=1<<13; /清除 LINE13上的中断标志位EXTI->PR=1<<15; /清除 LINE15上的中断标志

18、位四、定时计数器中断STM32共有 8个定时计数器, 其中 TIME1和 TIME8是高级定时器, TIME2TIME5是 通用定时器, TIME6和 TIME7是基本定时器,这里以 TIME3为例先总结以下定时计数器 的基本用法。定时计数器 TIME3中断的配置步骤:(1 TIME3时钟使能 RCC_APB1ENR例如:RCC->APB1ENR|=1<<1; /使能 TIME3的时钟;RCC->APB1ENR|=1<<2; /使能 TIME4的时钟;RCC->APB1ENR|=1<<3; /使能 TIME5的时钟;RCC->APB1

19、ENR|=0X01; /使能 TIME2的时钟使能; (RCC->APB1ENR|=1<<0; 其余的一次类推。 RCC_APB2ENR(2设置 TIM3_ARR和 TIM3_PSC的值 TIMx_PSC(TIM6和 TIM7预分频器 TIMx_DIER 例如:TIM3->DIER|=1<<0;/允许更新中断 TIM3->DIER|=1<<6; /允许触发中断 (4允许 TIM3工作(使能 TIM3 TIMx_CR1 例如:TIM3->CR1|=0x01; /使能定时器 3TIMx_SR该寄存器用来标记当前预定时器相关的各种事件 /中

20、断是否发生。 UIF :更新中断标记,当产生更新事件时该位由硬件置 1。 例如:if(TIM3->SR&0X0001/溢出中断 (5 TIM3中断分组设置例如:MY_NVIC_Init(1,3,TIM3_IRQChannel,2;/抢占 1,子优先级 3,组 2直接调用该函数就行 (6编写中断服务程序例如:void TIM3_IRQHandler(void if(TIM3->SR&0X0001/溢出中断 LED1=!LED1; TIM3->SR&=(1<<0;/清除中断标志位 参考程序: void Timerx_Init(u16 arr,u

21、16 psc RCC->APB1ENR|=1<<1;/TIM3时钟使能 TIM3->ARR=arr; /设定计数器自动重装值 /刚好 1ms TIM3->PSC=psc; /预分频器 7200, 得到 10Khz 的计数时钟 /这两个东东要同时设置才可以使用中断 TIM3->DIER|=1<<0; /允许更新中断 TIM3->DIER|=1<<6; /允许触发中断 TIM3->CR1|=0x01; /使能定时器 3 MY_NVIC_Init(1,3,TIM3_IRQChannel,2;/抢占 1,子优先级 3,组 2 TI

22、ME2的 CH2模式 2的 PWM 输出:脉冲宽度调制模式可以产生一个由寄存器 TIMx_ARR确定频率和由寄存器 TIMx_CCRx确定其占空比的 PWM 波形;使能定时器:RCC->APB1ENR|=1<<0; /使能 TIME2的时钟选择通道(共 4个通道 :在 TIMx_CCMRx寄存器中的 OCxM 位写入 110(PWM模式 TIMx_CCMR1(捕获 /比较模式寄存器 1 TIM2->CCMR1|=7<<12;/选择 PWM 模式 2使能预装载寄存器:必须设置 TIMx_CCMRx寄存器 OCxPE 位以使能相应的预装载寄 TIMx_CCMR1

23、(捕获 /比较模式寄存器 1 TIM2->CCMR1|=1<<11; /使能预装载寄存器使能自动重装载的预装载寄存器:最后还要设置 TIMx_CR1寄存器的 ARPE 位, (在向 上计数或中心对称模式中 使能自动重装载的预装载寄存器; TIMx_CR1TIMx_CR1|=1<<7; /使能自动装载的预分频寄存器设置极性:OCx 的极性可以通过软件在 TIMx_CCER寄存器中的 CCxP 位设置,它可以 TIMx_CCER(捕获 /比较使能寄存器 TIM2->CCER&=0X03;TIM2->CCMR|=1<<4; / /设置极性

24、并输出时能void Timerx2_Init(u16 arr,u16 pscRCC->APB1ENR|=1<<0; /使能 TIME2的时钟TIM3->ARR=arr;/设定计数器自动重装值TIM3->PSC=psc;/预分频器不分频TIM2->CCMR1|=7<<12; /选择 PWM 模式 2TIM2->CCMR1|=1<<11; /使能预装载寄存器TIM2->CR1|=1<<7; /使能自动装载的预分频寄存器TIM2->CR1|=1<<0; /使能定时器/ TIM2->CCER=0

25、X3303;TIM2->CCER|=1<<4; /设置极性并输出时能比如利用 TIM3的通道 TH3产生 PWM 输出:void PWM_Init(u16 arr,u16 pscRCC->APB1ENR|=1<<1; /TIM3时钟使能GPIOA->CRL&=0X0FFFFFFF;/PA7输出GPIOA->CRL|=0XB0000000;/复用功能输出GPIOA->ODR|=1<<7;/PA7上拉TIM3->ARR=arr;/设定计数器自动重装值TIM3->PSC=psc;/预分频器不分频TIM3->C

26、CMR1|=7<<12; /CH2 PWM2模式TIM3->CCMR1|=1<<11; /CH2预装载使能TIM3->CCER|=1<<4; /OC2 输出使能TIM3->CR1=0x8000; /ARPE使能TIM3->CR1|=0x01; /使能定时器 3其余几个定时器的 PWM 输出寄存器配置依次类推。以下 子说明如何在 TI1输入的上升沿时捕获计数器的值到 TIM1_CCR1寄存器中, 步骤如下:1、使能 TIM1时钟:RCC_APB2ENR的 015位(0632位保留RCC->APB2ENR|=1<<11;

27、 /使能 TIME1的时钟2、 选择有效输入端 :TIM1_CCMR1必须 . 接到 TI1 输入,所以写入 TIM1_CCMR1寄存器中的 CC1S=01,一 旦 CC1S=01不为 00时, 通道被配置为输入 , 并且 TIM1_CCMR1 寄存器变 . 只读 。 TIM1_CCMR1(捕获 /比较模式寄存器 1TIM1->CCMR1=0X01; /CC1通道选择输入, IC1映射在 TI1上 3、根据输入信号的特点,配置输入滤波器为所需的带宽(输入为 TI1时 TIM1_CCMRx寄 存器中的 ICxF 位 。假设输入信号在最多 5 个时钟周期的时间内抖动,我们 . 配置滤波器的

28、带长于 5个时钟周期。因此我们可以(以 fDTS 频 连续采样 8次,已确认在 TI1上一次 真实的边沿变换,即在 TIM1_CCMR1寄存器中写入 IC1F=0011. TIM1_CCMR1(捕获 /比较模式寄存器 1 TIM1->CCMR1|=3<<4; /TIMx_CCER(捕获 /比较使能寄存器 TIM1->CCER&=0<<1;5、配置输入预分频器。在本 中,我们希望捕获发生在每一个有效的电平转换时刻,因此预分频器被禁止 ( TIM1_CCMR1(捕获 /比较模式寄存器 1 (见第二步TIMx_CCER(捕获 /比较使能寄存器 TIM1-&

29、gt;CCER|=1<<0;7、 如 果 需 要 , 通 过 . 置 TIM1_DIER 寄 存 器 中 的 CC1IE 位 允 许 相 关 中 断 求 , 通 过 置TIMx_DIER(TIM1和 TIM8 DMA/中断使能寄存器TIM1->DIER|=1<<1;TIM1->DIER|=1<<0;捕获函数:void Tim1_th1_cap_Init(u16 arr,u16 pscRCC->APB2ENR|=1<<11; /使能 TIME1的时钟RCC->APB2ENR|=1<<2; /就是使能 GPIOA

30、的时钟RCC->CHL&=0XFFFFFFF0;RCC->CHL|=0X00000004; /设置 PA8为浮空输入TIM1->ARR=arr;TIM1->PSC=psc;TIM1->CCMR1=0X01; /CC1通道选择输入, IC1映射在 TI1上 TIM1->CCMR1|=3<<4; /TIM1->CCER&=0<<1; /上升沿触发TIM1->CCER|=1<<0; /捕获使能TIM1->DIER|=1<<1; /允许捕获中断TIM1->DIER|=1<&

31、lt;0; /允许更新中断TIM1->CR1|=1<<0; /使能计数器 1MY_NVIC_Init(1,1,TIM1_IRQChannel,2; /抢占 1, 子 1, 组 2 中断服务程序:主函数:五、 SPI 总线SPI_CR寄存器的 CPOL 和 CPHA 位,能够组合成四种可能的时序关系。 CPOL(时钟 极性 位控制在没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有 效。如果 CPOL 被清 0 , SCK 引脚在空闲状态保持低电平;如果 CPOL 被置 1 , SCK 引脚 在空闲状态保持高电平。如果 CPHA(时钟相位 位被置 1 , SCK

32、 时钟的第二个边沿 (CPOL位为 0时就是下降沿, CPOL 位为 1 时就是上升沿 进行数据位的采样, 数据在第二个时钟边沿被锁 。如果 CPHA 位被清 0 , SCK 时钟的第一边沿 (CPOL位为 0 时就是下降沿, CPOL 位为 1 时就是上升沿 SPI 配置成主模式:1、使能 SPI 时钟和 PORTA 时钟: RCC_APB2ENR的 015位(0632位保留RCC->APB2ENR|=1<<2; /PORTA时钟使能 RCC->APB2ENR|=1<<12; /SPI1时钟使能 SPI 控制寄存器 1(SPI_CR1 SPI1->C

33、R1|=0<<10;/全双工模式 SPI1->CR1|=1<<9; SPI1->CR1|=1<<8; /软件 nss 管理 SPI 控制寄存器 1(SPI_CR1SPI1->CR1|=1<<2; /SPI主机SPI1->CR1|=0<<11;/8bit数据格式 SPI 控制寄存器 1(SPI_CR1SPI1->CR1|=1<<1; /空闲模式下 SCK 为 1 CPOL=1 SPI1->CR1|=1<<0; /数据采样从第二个时间边沿开始 ,CPHA=1 SPI 控制寄存器

34、1(SPI_CR1SPI1->CR1|=7<<3; /Fsck=Fcpu/256SPI1->CR1|=0<<7; /MSBfirstSPI 控制寄存器 1(SPI_CR1SPI1->CR1|=1<<6; /SPI设备使能参考程序:void SPIx_Init(voidRCC->APB2ENR|=1<<2; /PORTA时钟使能RCC->APB2ENR|=1<<12; /SPI1时钟使能/这里只针对 SPI 口初始化GPIOA->CRL&=0X000FFFFF;GPIOA->CRL|=0

35、XBBB00000;/PA5.6.7复用GPIOA->ODR|=0X7<<5; /PA5.6.7上拉SPI1->CR1|=0<<10;/全双工模式SPI1->CR1|=1<<9; /软件 nss 管理SPI1->CR1|=1<<8;SPI1->CR1|=1<<2; /SPI主机SPI1->CR1|=0<<11;/8bit数据格式SPI1->CR1|=1<<1; /空闲模式下 SCK 为 1 CPOL=1SPI1->CR1|=1<<0; /数据采样从第二

36、个时间边沿开始 ,CPHA=1SPI1->CR1|=7<<3; /Fsck=Fcpu/256SPI1->CR1|=0<<7; /MSBfirstSPI1->CR1|=1<<6; /SPI设备使能SPIx_ReadWriteByte(0xff;/启动传输SPI 读写数据程序(注意全双工同时读写 :/SPIx读写一个字节/TxData:要写入的字节/返回值:读到的字节u8 SPIx_ReadWriteByte(u8 Txdatau8 temp=0;while(SPI->SR&1<<1=0/SPI->SR&

37、1<<1(发送缓冲区为空 ;(SPI->SR&1<<1=0(发送缓冲区为空不成立即 /发送缓冲区不为空则一直判断等待发送缓冲区为空(跳出 while 循环 才发送数据temp+;if(temp>300return 0; /若经判断发送缓冲区不为空则返回值“ 0”SPI->DR=Txdata; /若发送缓冲区为空则发送数据temp=0;while(SPI->SR&1<<0=0/(SPI->SR&1<<0=0(判断接收缓冲区是否为空若为空则接收数据 temp+;if(temp>300retu

38、rn 0;return SPI->DR;六、 DS18B20温度传感器用单片机控制温度传感器 DS18B20进行温度采集主要进行一下步骤:(1复位:首先我们必须对 DS18B20芯片进行复位,复位就是由控制器 (单片机 给 DS18B20单总线至少 480uS 的低电平信号。当 18B20接到此复位信号后则会在 1560uS后回发一个芯片 的存在脉冲。void DS18B20_Rst(voidDS18B20_IO_OUT(; /讲 PA0设置成输出状态DS18B20_DQ_OUT=0; /拉低 DQ (PA0接 DQ delay_us(750; /拉低 750usDS18B20_DQ_O

39、UT=1; / /DQ=1 释放数据线讲 DQ 交给 1820 delay_us(15; / /15US(2存在脉冲:在复位电平结束之后,控制器应该将数据单总线拉高,以便于在 1560uS后接收存在脉冲, 存在脉冲为一个 60240uS的低电平信号 。至此,通信双方已经达成了基 本的协议,接下来将会是控制器与 18B20间的数据通信。如果复位低电平的时间不足或是单 总线的电路断路都不会接到存在脉冲,在设计时要注意意外情况的处理。u8 DS18B20_Check(void /j检测 ds18b20是否存在u8 retry=0;DS18B20_IO_IN(;/SET PA0 INPUTwhile

40、(DS18B20_DQ_IN&&retry<200retry+;delay_us(1;if(retry>=200return 1;else retry=0;while (!DS18B20_DQ_IN&&retry<240retry+;delay_us(1;if(retry>=240return 1;return 0;(3控制器发送 ROM 指令:双方打完了招呼之后最要将进行交流了, ROM 指令共有 5条,每 一个工作周期只能发一条, ROM 指令分别是读 ROM 数据、指定匹配芯片、跳跃 ROM 、芯片搜索 、报警芯片搜索。 ROM 指

41、令为 8位长度,功能是对片内的 64位光刻 ROM 进行操作。其主要目的 是为了分辨一条总线上挂接的多个器件并作处理。诚然,单总线上可以同时挂接多个器件,并通过每个器件上所独有的 ID 号来区别,一般只挂接单个 18B20芯片时可以跳过 ROM 指令 (注意:此处指的跳过 ROM 指令并非不发送 ROM 指令,而是用特有的一条“跳过指令” 。控 制器发送存储器操作指令:在 ROM 指令发送给 18B20之后,紧接着 (不间断 就是发送存储器 操作指令了。操作指令同样为 8位,共 6条,存储器操作指令分别是写 RAM 数据、读 RAM 数据 、将 RAM 数据复制到 EEPROM 、温度转换、将

42、 EEPROM 中的报警值复制到 RAM 、工作方式切换。 存储器操作指令的功能是命令 18B20作什么样的工作,是芯片控制的关键。void DS18B20_Start(void/ ds1820 start convertDS18B20_Rst(;DS18B20_Check(;DS18B20_Write_Byte(0xcc; / skip rom 跳过 ROMDS18B20_Write_Byte(0x44; / convert 温度转换命令(4执行或数据读写:一个存储器操作指令结束后则将进行指令执行或数据的读写,这个操 作要视存储器操作指令而定。如执行温度转换指令则控制器(单片机必须等待 18

43、B20执行 其指令,一般转换时间为 500uS 。如执行数据读写指令则需要严格遵循 18B20的读写时序来 操作。数据的读写方法将有下文有详细介绍。若要读出当前的温度数据我们需要执行两次 工作周期,第一个周期为复位、跳过 ROM 指令、 执行温度转换存储器操作指令 、等待 500uS 温度转换时间。紧接着执行第二个周期为复位、跳过 ROM 指令、 执行读 RAM 的存储器操作指 令 、读数据 (最多为 9个字节,中途可停止,只读简单温度值则读前 2个字节即可 。其它的 操作流程也大同小异,在此不多介绍。七、内部 ADC 转换STM32最多会有三个内部 ADC 转换器, 每个转换器均有 18个通

44、道其中 16个外部通道和 2个内部通道 (信号源 。 每个 ADC 转换器都有单次、 连续、 扫描或间断四种工作模式, ADC 的结果可以左对齐或右对齐方式存储在 16位数据寄存器中。1、 ADC 开关控制通过设置 ADC_CR2寄存器的 ADON 位可给 ADC 上电。(1当第一次设置 ADON 位时,它将 ADC 从断电状态下唤醒;(2 ADC 上电延迟一段时间后 (tSTAB,再次设置 ADON 位时开始进行转换;(3通过清除 ADON 位可以停止转换,并将 ADC 置于断电模式。2、 ADC 时钟控制由时钟控制器提供的 ADCCLK 时钟和 PCLK2(APB2时钟 同步, RCC 控

45、制器为 ADC 时钟 提供一个专用的可编程预分频器。3、通道选择有 16个多路通道。可以把转换组织成两组:规则组和注入组。在任意多个通道上以任 意顺序进行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道 3、通道 8、 通道 2、通道 2、通道 0、通道 2、通道 2、通道 15。(1规则组由多达 16个转换组成。规则通道和它们的转换顺序在 ADC_SQRx寄存器 中选择。规则组中转换的总数应写入 ADC_SQR1寄存器的 L3:0位中。(2注入组由多达 4个转换组成。注入通道和它们的转换顺序在 ADC_JSQR寄存器中 选择。注入组里的转换总数目应写入 ADC_JSQR寄存器的 L

46、1:0位中。 如果 ADC_SQRx或 ADC_JSQR寄存器在转换期间被更改,当前的转换被清除,一个新的启动脉冲将发送到 ADC 以转换新选择的组。先说说利用 ADC1的通道 0的 单次转换模式 下的相关设置,这一节我们使用来进行 AD 转换 ,其详细设置步骤如下:1、开启 PA 口时钟,设置 PA0为模拟输入。这里将 PA0配置为 ADC 的第 0个采样 通道 ,所以,我们先要使能 PORTA 的时钟,然后 设置 PA0为模拟输入。RCC_APB2ENR|=1<<2; /使能 PORTA 口的时钟GPIOA->CRL&=0XFFFF0000; /PA0 1 2 3

47、 anolog输入2、使能 ADC1时钟,并设置分频因子。要使用 要使用 ADC1,第一步就是要使能 ADC1时钟,在使能完之后进行一次 的时钟 ,在使能完之后进行一次 ADC1的 复位。接着我们就可以通过 RCC_CFGR设置 ADC1的 分频因子。分频因子要确保 ADC1的时钟(ADCCLK 不要超过 14Mhz 。RCC_APB2ENR的 015位(0632位保留 例如:RCC->APB2ENR|=1<<9; /ADC1时钟使能同理:RCC->APB2ENR|=1<<10; /ADC2时钟使能RCC->APB2ENR|=1<<15;

48、/ADC3时钟使能 RCC_APB2RSTR|=1<<9; /ADC1复位同理:RCC->APB2ENR|=1<<10; /ADC2复位RCC->APB2ENR|=1<<15; /ADC3复位RCC_APB2RSTR|=(1<<9 ; /ADC1结束复位同理:RCC->APB2ENR|=(1<<10 ; /ADC2结束复位 RCC_CFGRRCC->CFGR&=(3<<14; /分频因子清零RCC->CFGR|=2<<14; /SYSCLK/DIV2=12M ADC 时 钟

49、 设 置 为 12M,ADC 最大时钟不能超过 14M ,否则将导致 ADC 准确度下降 !3、设置 ADC1的工作模式。在设置完分频因子之后,我们就可以开始 ADC1的模式配置了,设置单次转换模式、 触发方式选择、数据对齐方式等都在这一步实现。 ADC_CR1(ADC 控制寄存器 1ADC1->CR1&=0XF0FFFF; /工作模式清零ADC1->CR1|=0<<16; /独立工作模式 ADC_CR2(ADC 控制寄存器 2ADC1->CR2&=(1<<1; /单次转换模式ADC1->CR2&=(7<<17;ADC1->CR2|=7<<17; /软件控制转换ADC1->CR2|=1<<20; /使用用外部触发 (SWSTART! 必 须 使 用一个事件来触发ADC1->CR2&=(1<<11; /右对齐4、设置 ADC1规则序列的相关信息。接下来我们要设置规则序列的相关信息,这里只有一个通道并且是单次转换所以设置 ADC_SMPR2(ADC 采样时间寄存器ADC1->SQR1&=(0XF<<20;ADC1->SQR1&=0<<20

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论