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;上/下拉输入模式(输入口用):0x8;复用输出(第二供能):0xB;STM32F407学习笔记1、系统时钟的设置:Stm32_Clock_Init(168,4,2,7);参数分别是:PLLN,PLLM,PLLP,PLLQHSE分频PLLM之后为VCO的输入,一般VCO的输入要求为1~2MHz,一般建议取为2MHz,防止PLL抖动。VCO输出是输入的PLLN倍频,SYSCLK在去PLL输出时,SYSCLK=PLL=HSE/PLLM*PLLN/PLLP而PLLQ是为48MHz时钟配置用的,CLK48=HSE/PLLM*PLLN/PLLQ所以要设置系统时钟为168MHz时候推荐的参数取值为SYSCLK=PLL=HSE/PLLM*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);参数不能大于7989153、普通IO的使用a.首先是使能时钟RCC-AHB1ENR|=15;在该寄存器相应的位置1即可b.IO口模式设置:GPIO_Set(GPIOF,PIN9|PIN10,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);参数分别是:GPIOx,PIN9|PIN10(具体对应的口,可以使用与的关系)因为每种占一位#definePIN010#definePIN111#definePIN212#definePIN313#definePIN414#definePIN515#definePIN616#definePIN717#definePIN818#definePIN919#definePIN10110#definePIN11111#definePIN12112#definePIN13113#definePIN14114#definePIN15115Mode:四种,各个模式只能设置一种#defineGPIO_MODE_IN0//普通输入模式#defineGPIO_MODE_OUT1//普通输出模式#defineGPIO_MODE_AF2//AF功能模式#defineGPIO_MODE_AIN3//模拟输入模式输出推挽或者开漏选择:#defineGPIO_OTYPE_PP0//推挽输出#defineGPIO_OTYPE_OD1//开漏输出推挽输出可输出强的高、低电平,用于连接数字器件开漏输出相当于三极管的集电极,电流型驱动,只可以输出强的低电平,高电平需外拉。(电路中只有一个MOS管)GPIO的速度#defineGPIO_SPEED_2M0#defineGPIO_SPEED_25M1#defineGPIO_SPEED_50M2#defineGPIO_SPEED_100M3#defineGPIO_PUPD_NONE0//不带上拉不带下拉#defineGPIO_PUPD_PU1//上拉#defineGPIO_PUPD_PD2//下拉#defineGPIO_PUPD_RES3//保留注意:IO口推挽输出时候是否上拉不重要,但是尽量设置成为上拉或者是下课,如果外设是高低平驱动则设置成下拉,低电平驱动设置成为上拉,防止误动作。按键扫描笔记:按键扫描函数同以前的一样不必多讲主要是讲解IO口作为输入口的设置:GPIO通用设置GPIO_Set函数的前两个参数是用于来定位具体的哪一个IO口的,第三个参数是设置输入输出模式的按键是普通输入模式,第四第五参数是与输出有关的,写为0即可,最后一个参数设置需要看按键按下是高电平则设置为下拉,按键按下是低电平则设置为上拉。串口实验:串口初始化函数参数:第一个是APB2的时钟PCLK2。第二个是波特率,不用多说uart_init(84,115200);时钟设置:需要设置两个时钟,一个相应外设的时钟,一个是对应的IO口的时钟。APB2的时钟PCLK2的设置,默认系统SYSCLK=168时候APB2=84MHz设置需要自己配置寄存器(自己测试)RCC_CFGR寄存器设置:[15:13]APB2(高速)从PHB而来,可以设置自己的分频(1,2,4,8,16)最高84MHz,系统默认是不分频[12:10]APB1(低速)从PHB而来,可以设置自己的分频(1,2,4,8,16)最高42MHz,系统默认是不分频[7:4]AHB从SYSCLK而来,可以设置自己的分频(1,2,4,8,16,64,128,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/RTCAF1:TIM1/TIM2;AF2:TIM3~5;AF3:TIM8~11AF4:I2C1~I2C3;AF5:SPI1/SPI2;AF6:SPI3;AF7:USART1~3;AF8:USART4~6;AF9:CAN1/CAN2/TIM12~14AF10:USB_OTG/USB_HSAF11:ETHAF12:FSMC/SDIO/OTG/HSAF13:DCIMAF14:AF15:EVENTOUT串口中断设置:MY_NVIC_Init(NVIC_PreemptionPriority,NVIC_SubPriority,NVIC_Channel,NVIC_Group)4个参数:分别是抢占优先级数:响应优先级数:中断编号:在顶层头文件stm32f4xx.h中包含定义是一个枚举类型:IRQn类型数据中断分组:0~4组//组0:0位抢占优先级,4位响应优先级//组1:1位抢占优先级,3位响应优先级//组2:2位抢占优先级,2位响应优先级//组3:3位抢占优先级,1位响应优先级//组4:4位抢占优先级,0位响应优先级串口发送时候可以正常使用printf函数,同以前学习的C语言一样使用,注意一点是换行必须是\r\n一起使用才行。外部中断使用:外部中断分两部分,初始化与中断服务程序的编写初始化:第一步:外部中断一般必须要与按键输入一起使用,所以外部中断必须有与按键一样的IO初始化,直接照搬过来即可第二步:中端口映射与触发设置(包括开启中断)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)该函数同上,串口处已经讲过中断服务函数部分:voidEXTI0_IRQHandler(void){delay_ms(10);if(WK_UP==1){BEEP=!BEEP;}EXTI-PR=10;//}中断服务程序是一个函数,该函数的函数名是一个固定的,叫做中断向量,定义在启动文件startup_stm32f40_41xxx.s中,已经被定义好了,不能随便定义。所有的中断服务程序函数名都在这里被定义了。用的时候去选用就行了。注意外部中断的0~4外部中断是每一个单独的外部中断,5~9公用一个中断服务程序:EXTI9_5_IRQHandler10~15公用:EXTI15_10_IRQHandler中断服务函数执行完毕前要清除中断标志:EXTI-PR=10;请标志是在相应的寄存器(挂起寄存器PendingRegister)的相应为置1,而不是清零当中断公用一个中断服务函数时候如何进行区分:可以在中断服务程序里检测判断:通道读取各个中断对应的IO口的状态进行判断。里面可以这样写if((EXTI-PR&0x20)==0x20)//说明中断线5发生了中断{//中断内容}EXTI-PR|=15;//清除中断挂起例如下面代码:voidEXTI9_5_IRQHandler(void){delay_ms(10);//延时去抖动if(KEY3==0){DS3=!DS3;}elseif(KEY4==0)//{DS3=!DS3;}elseif(KEY5==0){DS3=!DS3;}EXTI_ClearITPendingBit(EXTI_Line5);EXTI_ClearITPendingBit(EXTI_Line8);EXTI_ClearITPendingBit(EXTI_Line9);}有个问题,为什么库函数版本的程序里面中断配置里有一个要选择是中断模式还是事件模式,这个地方没有看懂?外部中断的红色代码没有进行测试。需要测试一下外部中断讲解完毕。定时器:定时器分为初始化和中断程序编写:初始化: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:GPIOAclockRCC_AHB1Periph_GPIOB:GPIOBclockRCC_AHB1Periph_GPIOC:GPIOCclockRCC_AHB1Periph_GPIOD:GPIODclockRCC_AHB1Periph_GPIOE:GPIOEclockRCC_AHB1Periph_GPIOF:GPIOFclockRCC_AHB1Periph_GPIOG:GPIOGclockRCC_AHB1Periph_GPIOG:GPIOGclockRCC_AHB1Periph_GPIOI:GPIOIclockRCC_AHB1Periph_GPIOJ:GPIOJclock(STM32F42xxx/43xxxdevices)RCC_AHB1Periph_GPIOK:GPIOKclock(STM32F42xxx/43xxxdevices)RCC_AHB1Periph_CRC:CRCclockRCC_AHB1Periph_BKPSRAM:BKPSRAMinterfaceclockRCC_AHB1Periph_CCMDATARAMENCCMdataRAMinterfaceclockRCC_AHB1Periph_DMA1:DMA1