版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、STM32F1031、IO口处理IO口包含7个寄存器配置寄存器两个:CRL(32),CRH(32)数据寄存器两个:IDR(32),ODR(32),但是他们只用了16位置位复位寄存器:BSRR(32)复位寄存器:BRR(16)锁存寄存器:LCKR(32)常用的有前面四个:其中前面两个是用来设置的,后面两个是用来操作的。每个IO口占用四位进行设置(低两位是MODE,高两位是CNF),每组16个,总共需要64个位设置,分别从CRL低位开始,到CRH的高位结束。每个IO口四位二进制的常用配置:模拟输入模式(ADC):0x0;推挽输出模式(输出口50MHz):0x3;上/下拉输入模式(输入口用): 0x
2、8;复用输出(第二供能):0xB;STM32F407学习笔记1、 系统时钟的设置:Stm32_Clock_Init(168,4,2,7);参数分别是:PLLN,PLLM,PLLP,PLLQHSE分频PLLM之后为VCO的输入,一般VCO的输入要求为12MHz,一般建议取为2MHz,防止PLL抖动。VCO输出是输入的PLLN倍频,SYSCLK在去PLL输出时,SYSCLK = PLL=HSE/PLLM*PLLN/PLLP而PLLQ是为48MHz时钟配置用的,CLK48= HSE/PLLM*PLLN/PLLQ所以要设置系统时钟为168MHz时候推荐的参数取值为SYSCLK = PLL=HSE/PL
3、LM*PLLN/PLLP =8/4*168/2=168MHzCLK48= HSE/PLLM*PLLN/PLLQ=8/4*168/7=48MHz2、 延时函数设置:delay_init(168);延时函数参数为系统时钟SYSCLK初始化后就可以调用延时函数:delay_ms(ms);参数不能大于65536,因为参数是16位数delay_us(us);参数不能大于798915 3、 普通IO的使用a.首先是使能时钟RCC->AHB1ENR|=1<<5;在该寄存器相应的位置1即可b.IO口模式设置:GPIO_Set(GPIOF,PIN9|PIN10,GPIO_MODE_OUT,GP
4、IO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); 参数分别是:GPIOx, PIN9|PIN10(具体对应的口,可以使用与的关系)因为每种占一位#define PIN01<<0#define PIN11<<1#define PIN21<<2#define PIN31<<3#define PIN41<<4#define PIN51<<5#define PIN61<<6#define PIN71<<7#define PIN81<<8#define PIN9
5、1<<9#define PIN101<<10#define PIN111<<11#define PIN121<<12#define PIN131<<13#define PIN141<<14#define PIN151<<15Mode:四种,各个模式只能设置一种#define GPIO_MODE_IN 0/普通输入模式#define GPIO_MODE_OUT1 /普通输出模式#define GPIO_MODE_AF2/AF功能模式#define GPIO_MODE_AIN3/模拟输入模式输出推挽或者开漏选择:#
6、define GPIO_OTYPE_PP0/推挽输出#define GPIO_OTYPE_OD1/开漏输出推挽输出可输出强的高、低电平,用于连接数字器件开漏输出相当于三极管的集电极,电流型驱动,只可以输出强的低电平,高电平需外拉。(电路中只有一个MOS管)GPIO的速度#define GPIO_SPEED_2M0#define GPIO_SPEED_25M1#define GPIO_SPEED_50M2#define GPIO_SPEED_100M3#define GPIO_PUPD_NONE0/不带上拉不带下拉#define GPIO_PUPD_PU1/上拉#define GPIO_PUPD
7、_PD2/下拉#define GPIO_PUPD_RES3/保留注意:IO口推挽输出时候是否上拉不重要,但是尽量设置成为上拉或者是下课,如果外设是高低平驱动则设置成下拉,低电平驱动设置成为上拉,防止误动作。按键扫描笔记:按键扫描函数同以前的一样不必多讲主要是讲解IO口作为输入口的设置:GPIO通用设置GPIO_Set函数的前两个参数是用于来定位具体的哪一个IO口的,第三个参数是设置输入输出模式的按键是普通输入模式,第四第五参数是与输出有关的,写为0即可,最后一个参数设置需要看按键按下是高电平则设置为下拉,按键按下是低电平则设置为上拉。串口实验:串口初始化函数参数:第一个是APB2的时钟PCLK
8、2。第二个是波特率,不用多说uart_init(84,115200);时钟设置:需要设置两个时钟,一个相应外设的时钟,一个是对应的IO口的时钟。APB2的时钟PCLK2的设置,默认系统SYSCLK=168时候APB2=84MHz设置需要自己配置寄存器(自己测试)RCC_CFGR寄存器设置:15:13APB2(高速)从PHB而来,可以设置自己的分频(1,2,4,8,16)最高84MHz,系统默认是不分频12:10APB1(低速)从PHB而来,可以设置自己的分频(1,2,4,8,16)最高42MHz,系统默认是不分频7:4AHB从SYSCLK而来,可以设置自己的分频(1,2,4,8,16,64,1
9、28,236,512)当使用以太网时候AHB时钟至少为25MHz在系统时钟分设置时候早已经将APB2设置为2分配,PHB不分频,APB1设置为4分频IO口设置分为通用设置和复用设置GPIO设置:GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);设置相应的功能:设置为推挽上拉输出,且为复用模式复用输出GPIO_AF_Set(GPIOA,9,7);前两个参数是定位IO口,后面一个参数是定位属于哪一中复用AF0:MCO/SWD/SWCLK/RTC AF1:TIM1/TIM2; AF2:T
10、IM35; AF3:TIM811AF4:I2C1I2C3; AF5:SPI1/SPI2; AF6:SPI3; AF7:USART13;AF8:USART46; AF9:CAN1/CAN2/TIM1214 AF10:USB_OTG/USB_HS AF11:ETHAF12:FSMC/SDIO/OTG/HS AF13:DCIM AF14: AF15:EVENTOUT串口中断设置:MY_NVIC_Init(NVIC_PreemptionPriority,NVIC_SubPriority,NVIC_Channel, NVIC_Group)4个参数:分别是抢占优先级数:响应优先级数:中断编号:在顶层头文件
11、stm32f4xx.h中包含定义是一个枚举类型:IRQn类型数据中断分组:04组/组0:0位抢占优先级,4位响应优先级/组1: 1位抢占优先级,3位响应优先级/组2: 2位抢占优先级,2位响应优先级/组3: 3位抢占优先级,1位响应优先级/组4: 4位抢占优先级,0位响应优先级串口发送时候可以正常使用printf函数,同以前学习的C语言一样使用,注意一点是换行必须是rn一起使用才行。外部中断使用:外部中断分两部分,初始化与中断服务程序的编写初始化:第一步:外部中断一般必须要与按键输入一起使用,所以外部中断必须有与按键一样的IO初始化,直接照搬过来即可第二步:中端口映射与触发设置(包括开启中断)
12、Ex_NVIC_Config(GPIO_E,2,FTIR); 参数1与参数2是选择映射的IO口,参数3是触发模式:FTIR=1标示下降沿触发,RTIR=2标示上升沿 3标示任意沿注意该函数一次调用只能设置一个IO口,多个口需要多次调用第三步:设置中断分组优先级以及终端号(包括是使能中断)MY_NVIC_Init(NVIC_PreemptionPriority,NVIC_SubPriority,NVIC_Channel, NVIC_Group)该函数同上,串口处已经讲过中断服务函数部分:void EXTI0_IRQHandler(void)delay_ms(10);if(WK_UP=1) BEE
13、P=!BEEP; EXTI->PR=1<<0; / 中断服务程序是一个函数,该函数的函数名是一个固定的,叫做中断向量,定义在启动文件startup_stm32f40_41xxx.s中,已经被定义好了,不能随便定义。所有的中断服务程序函数名都在这里被定义了。用的时候去选用就行了。注意外部中断的04外部中断是每一个单独的外部中断,59公用一个中断服务程序:EXTI9_5_IRQHandler1015公用:EXTI15_10_IRQHandler中断服务函数执行完毕前要清除中断标志:EXTI->PR=1<<0;请标志是在相应的寄存器(挂起寄存器Pending Re
14、gister)的相应为置1,而不是清零当中断公用一个中断服务函数时候如何进行区分:可以在中断服务程序里检测判断:通道读取各个中断对应的IO口的状态进行判断。里面可以这样写 if(EXTI->PR & 0x20)=0x20) /说明中断线5发生了中断 /中断内容 EXTI->PR|=1<<5;/清除中断挂起例如下面代码:void EXTI9_5_IRQHandler(void
15、)delay_ms(10);/延时去抖动if(KEY3=0) DS3=!DS3;else if(KEY4=0) /DS3=!DS3; else if(KEY5=0) DS3=!DS3;EXTI_ClearITPendingBit(EXTI_Line5); EXTI_ClearITPendingBit(EXTI_Line8); EXTI_ClearITPendingBit(EXTI_Line9); 有个问题,为什么库函数版本的程序里面中断配置里有一个要选择是中断模式还是事件模式,这个地方没有看懂?外部中断的红色代码没有进行测试。需要测试一下外部中断讲解完毕。定时器:定时器分为初始化和中断程序编写
16、:初始化:TIM3_Int_Init(5000-1,8400-1);该函数有两个参数:第一个参数是arr自动重装初值,第二个参数是时钟分频数定时器溢出时间:Tout=(arr+1)*(psc+1)/Ft 单位是us其中Ft为定时器的工作频率单位MHzFt=APB1*2=42*2=84MHz如图,因为APB1分频系数presc = 4,APB2分频系数presc = 2,所以此处是else,APB1或者APB2时钟的二倍作为定时器时钟。各种时钟的挂载:RCC_AHB1Periph_GPIOA: GPIOA clockRCC_AHB1Periph_GPIOB: GPIOB clock RCC_AH
17、B1Periph_GPIOC: GPIOC clockRCC_AHB1Periph_GPIOD: GPIOD clockRCC_AHB1Periph_GPIOE: GPIOE clockRCC_AHB1Periph_GPIOF: GPIOF clockRCC_AHB1Periph_GPIOG: GPIOG clockRCC_AHB1Periph_GPIOG: GPIOG clockRCC_AHB1Periph_GPIOI: GPIOI clockRCC_AHB1Periph_GPIOJ: GPIOJ clock (STM32F42xxx/43xxx devices) RCC_AHB1Perip
18、h_GPIOK: GPIOK clock (STM32F42xxx/43xxx devices) RCC_AHB1Periph_CRC: CRC clockRCC_AHB1Periph_BKPSRAM: BKPSRAM interface clockRCC_AHB1Periph_CCMDATARAMEN CCM data RAM interface clockRCC_AHB1Periph_DMA1: DMA1 clockRCC_AHB1Periph_DMA2: DMA2 clockRCC_AHB1Periph_DMA2D: DMA2D clock (STM32F429xx/439xx devi
19、ces) RCC_AHB1Periph_ETH_MAC: Ethernet MAC clockRCC_AHB1Periph_ETH_MAC_Tx: Ethernet Transmission clockRCC_AHB1Periph_ETH_MAC_Rx: Ethernet Reception clockRCC_AHB1Periph_ETH_MAC_PTP: Ethernet PTP clockRCC_AHB1Periph_OTG_HS: USB OTG HS clockRCC_AHB1Periph_OTG_HS_ULPI: USB OTG HS ULPI clockRCC_AHB2Periph
20、_DCMI: DCMI clockRCC_AHB2Periph_CRYP: CRYP clockRCC_AHB2Periph_HASH: HASH clockRCC_AHB2Periph_RNG: RNG clockRCC_AHB2Periph_OTG_FS: USB OTG FS clockRCC_APB1Periph_TIM2: TIM2 clockRCC_APB1Periph_TIM3: TIM3 clockRCC_APB1Periph_TIM4: TIM4 clockRCC_APB1Periph_TIM5: TIM5 clockRCC_APB1Periph_TIM6: TIM6 clo
21、ckRCC_APB1Periph_TIM7: TIM7 clockRCC_APB1Periph_TIM12: TIM12 clockRCC_APB1Periph_TIM13: TIM13 clockRCC_APB1Periph_TIM14: TIM14 clockRCC_APB1Periph_WWDG: WWDG clockRCC_APB1Periph_SPI2: SPI2 clockRCC_APB1Periph_SPI3: SPI3 clockRCC_APB1Periph_USART2: USART2 clockRCC_APB1Periph_USART3: USART3 clockRCC_A
22、PB1Periph_UART4: UART4 clockRCC_APB1Periph_UART5: UART5 clockRCC_APB1Periph_I2C1: I2C1 clockRCC_APB1Periph_I2C2: I2C2 clockRCC_APB1Periph_I2C3: I2C3 clockRCC_APB1Periph_CAN1: CAN1 clockRCC_APB1Periph_CAN2: CAN2 clockRCC_APB1Periph_PWR: PWR clockRCC_APB1Periph_DAC: DAC clockRCC_APB1Periph_UART7: UART
23、7 clockRCC_APB1Periph_UART8: UART8 clockRCC_APB2Periph_TIM1: TIM1 clockRCC_APB2Periph_TIM8: TIM8 clockRCC_APB2Periph_USART1: USART1 clockRCC_APB2Periph_USART6: USART6 clockRCC_APB2Periph_ADC1: ADC1 clockRCC_APB2Periph_ADC2: ADC2 clockRCC_APB2Periph_ADC3: ADC3 clockRCC_APB2Periph_SDIO: SDIO clockRCC_
24、APB2Periph_SPI1: SPI1 clockRCC_APB2Periph_SPI4: SPI4 clockRCC_APB2Periph_SYSCFG: SYSCFG clockRCC_APB2Periph_TIM9: TIM9 clockRCC_APB2Periph_TIM10: TIM10 clockRCC_APB2Periph_TIM11: TIM11 clockRCC_APB2Periph_SPI5: SPI5 clockRCC_APB2Periph_SPI6: SPI6 clockRCC_APB2Periph_SAI1: SAI1 clock (STM32F42xxx/43x
25、xx devices) RCC_APB2Periph_LTDC: LTDC clock (STM32F429xx/439xx devices)定时器中断服务程序编写:函数名称已经定义好了,就是启动文件中的中断向量表void TIM3_IRQHandler(void) if(TIM3->SR&0X0001)/溢出中断LED1=!LED1;/中断的内容 TIM3->SR&=(1<<0);/清除标志位 定时器输出PWM波形:初始化函数TIM14_PWM_Init(u32 arr,u32 psc)参数分别是重装初值和预分频系数,与之前讲的相同主要是为了设置溢出时
26、间,也就是PWM波形的周期占空比设置:#define PWM_VAL TIM14->CCR1 通过寄存器CCR1的值进行设置该寄存器值最大为arr占空比= PWM_VAL /arr*100%TIM_PWM初始化中不同的是要加上IO口设置:IO时钟使能,通用IO口设置(选择具体IO口设置为复用输出,推挽输出,输出速率,上拉输出)复用IO设置(同之前串口讲过的部分)剩下的设置:以后慢慢测试重映设部分:自己看看手册ADC与DMA部分讲解:DMA部分讲解:F407总共两个DMA控制器共有16个数据流(stream),每一个控制器8个,每一个数据流有8个通道(channel)或请求(request
27、),每一个通道都一个仲裁器处理处理优先级。两种模式:FIFO模式:直接模式:外设对应的控制器,数据流,通道是规定好的,使用时需要查表使用,不能随便设置。传输数量最大65535个,在地址增量模式下,只有当传输完设置的所有数据个数以后才会再次王内存地址的第一个地址中存数,否则内存指针会一直增加。循环模式:ADC比较适合这中模式,如果此时配置了存储器突发模式,此时传输数量DMA_SxNDTR=(Mburst节拍)X(Msize)/(Psize)的倍数。循环模式标示传完DMA_SxNDTR个数量之后再从头接着传单次传输:突发传输:仅在指针增量模式下使用FIFO的阀值必须与突发传输的值进行匹配流控制器:
28、DMA控制器的时候传输数量DMA_SxNDTR可以设定外设为流控制器的时候传输数量DMA_SxNDTR没有用定时器:三种:高级,通用,基本定时器时钟输入四种:RCCETR外部引脚:经过极性选择等等ITR0-3:内部的级联,来自其他定时器的TRGOTI1FP:定时器外部引脚经过一个PSC预分频器后得到CK_CNT基本计数单元输入捕获输出比较控制输入捕获与输出比较是一个通道,不能同时用TIM_Clock_Division_CKD:这个是输入捕获时候用的配置:时钟选择:APB1时钟X2/X1CK_INT或者CK_PSCAPB1的分频系数是1时候则X1APB1的分频系数不是1时候则X2一般是APB1=
29、AHB/4=42,因此处要X2所以CK_INT=84然后在进行分频:这个是预分频系数TIM_Prescaler模式:向上,向下,中央对齐(*(volatile unsigned long *)(摘自Openedv)对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制,因为C语言并没有提供真正的“端口”的概念。如果是内存映射,那就方便的多了。以 #define IOPIN (*(volatile unsigned long *) 0xE0028000) 为例:作为一个宏定义语句,define是
30、定义一个变量或常量的伪指令。首先( volatile unsigned long * )的意思是将后面的那个地址强制转换成 volatile unsigned long * ,unsigned long * 是无符号长整形,volatile 是一个类型限定符,如const一样,当使用volatile限定时,表示这个变量是依赖系统实现的,以为着这个变量会被其他程序或者计算机硬件修改,由于地址依赖于硬件,volatile就表示他的值会依赖于硬件。volatile 类型是这样的,其数据确实可能在未知的情况下发生变化。比如,硬件设备的终端更改了它,现在硬件设备往往也有自己的私有内存地址,比如显存,他们一般是通过映象的方式,反映到一段特定的内存地址当中,这样,在某些条件下,程序就可以直接访问这些私有内存了。另外,比如共享的内存地址,多个程序都对它操作的时候。你的程序并不知道,这个内存何时被改变了。如果不加这个voliatile修饰,程序是利用catch当中的数据,那个可能是过时的了,加了 voliatile,就在需要用的时候,程序重新去那个地址去提取,保证是最新的。归纳起来如下:1. volatile变量可变允许除了程序之外的比如硬件来修改他的内容 2. 访问该数据任何时候都会直接访问
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 事业单位土木工程岗面试高频考题试卷及参考答案202
- 事业单位财会岗面试高频考题试卷及参考答案
- 2027年备考会计基础 【零基础学员必练】押题练习试题(备用卷)含答案
- 2027年备考会计基础 【零基础学员必练】通关考试题库带答案解析
- 2026年湖南安全技术职业学院高职单招笔试英语历年参考题库含答案解析
- 2026年湖北艺术职业学院高职单招笔试英语历年参考题库含答案解析
- 2026年温州科技职业学院高职单招笔试职业适应性测验历年参考题库含答案解析
- 2026年海南政法职业学院高职单招笔试化学历年参考题库含答案解析
- 2026年济宁职业技术学院高职单招笔试职业适应性测验历年参考题库含答案解析
- 2026年泉州海洋职业学院高职单招笔试物理历年参考题库含答案解析
- 2026年医疗器械监督管理条例培训试卷附答案
- (正式版)DB14∕T 1324-2016 《公路桥梁预应力钢绞线局部释放法测试现存应力技术指南》
- 郑州网约车资格证模拟考试及答案
- 多资产配置全景研究系列控波御险:多资产组合风险管理方法论
- 2026年体育教研员竞聘题库(附答案)
- 水泥产品碳足迹核算报告
- 新版西师版五年级上册数学全册教案(完整版)教学设计含教学反思
- 电梯工程安装及后期保养合同三篇
- 人工智能驱动下的人才竞争力评价与专业演变研究
- 2025年正高面审答辩正高面审答辩重症医学笔试参考题库附带答案详解
- 工业网络和现场总线技术基础与案例
评论
0/150
提交评论