完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1、总结
程序模板 第一步:申明结构体; xxx_InitTypeDef xxx_InitStructure; 第二步:开启时钟; (第一步和第二步顺序不能调换:标准c要求所有变量/结构体,都必须在代码段之前声明) RCC_xPeriphClockCmd(RCC_AxBxPeriph_xxx, ENABLE) { *2.5:引脚复用(如果有) GPIO_PinAFConfig(GPIOx,GPIO_PinSourcex,GPIO_AF_x) } 第三步:初始化结构体; 。..xxx_Init(xxx,&xxx_InitStructure) { *若有设置中断 中断名在startup_stm32f40_41xx.s中定义。 第一步:使能外设某特定中断(定时器,串口,ADC) xxx_ITConfig(xxx, xxx, ENABLE); 第二步:初始化 NVIC 。..NVIC_Init(&NVIC_InitStructure); 第三步:设置系统中断优先级分组(通常在主函数中配置) NVIC_PriorityGroupConfig(NVIC_PriorityGroup_x); 中断服务函数(典型) void xxx_IRQHandler(void) { if(xxx_GetITStatus(xxx)!=RESET)//判断某个线上的中断是否发生 { …中断逻辑… xxx_ClearITPendingBit(xxx); //清除 LINE 上的中断标志位 } } 其它中断相关 xxx_GetITStatus(xxx)//获取中断状态,查看中断是否发生 // xxx_ClearITPendingBit(xxx);//清除 else xxx_ClearFlag(xxx);//清除 //前者会先判断这种中断是否使能,使能了才去判断中断标志位, //而后者直接用来判断状态标志位。 } END.定时器/串口/ADC使能 xxx_Cmd(xxx, ENABLE); 2、具体内容 时钟 使能时钟 RCC_xPeriphClockCmd(RCC_AxBxPeriph_xxx, ENABLE) GPIO 引脚复用 GPIO_PinAFConfig(GPIOx,GPIO_PinSourcex,GPIO_AF_x) 初始化结构体初始化 GPIO 的常用格式 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x | GPIO_Pin_x;//同时设置两个同在GPIOx的引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_xxx;//IN,OUT,AF,AN GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOx,&GPIO_InitStructure); 其它 GPIO_SetBits(GPIOx,GPIO_Pin_x); GPIO_ResetBits(GPIOx,GPIO_Pin_x); USART 初始化结构体初始化 USART 的常用格式 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = bound;//一般设置为 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为 8 位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx |USART_Mode_Tx;//收发模式 USART_Init(USARTX, &USART_InitStructure); //初始化串口 使能串口相应中断 USART_ITConfig(USARTx,USART_IT_xxx,ENABLE); //其中: USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);//使能接受中断 USART_ITConfig(USARTx, USART_IT_TXE, ENABLE);//使能发送中断 使能串口 USART_Cmd(USARTx, ENABLE); 中断服务状态 USART_GetITStatus(USARTx, USART_IT_TC) USART_ClearITPendingBit((USARTx, USART_IT_TC);//清除 收发数据 STM32F4 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是一个双寄存器,包含了 TDR 和 RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时候,也是存在该寄存器内。 USART_SendData(USARTx, USART_RX_BUF[t]); USART_ReceiveData(USARTx); 中断分组(NVIC) 涉及到中断必须配置NVIC以及中断分组。 初始化结构体初始化 NVIC 的常用格式 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = xxx_IRQn;//设置中断名 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级 3 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //响应优先级 3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化 VIC 寄存器、 系统中断优先级分组(main函数设置) NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 中断服务函数 void xxx_IRQHandler(void) { 。.. } 外部中断 STM32F4 的每个 IO 都可以作为外部中断的中断输入口。STM32F4 供 IO 口使用的中断线有 16 个。 GPIO 的管脚 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G,H,I)分别对应中断线 0~15。 使能 SYSCFG 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//只要使用外部中断,就必须打开 SYSCFG 时钟 配置 GPIO 与中断线的映射关系 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOx, EXTI_PinSourcex); 备注: GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式 初始化结构体初始化外部中断的常用格式 EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line=EXTI_Linex; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_xxx;//上升,下降沿或任意电平 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //初始化外设 EXTI 寄存器 中断服务函数 void EXTI3_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Linex)!=RESET)//判断某个线上的中断是否发生 { …中断逻辑… EXTI_ClearITPendingBit(EXTI_Linex); //清除 LINE 上的中断标志位 } } 中断服务状态 EXTI_GetITStatus(EXTI_Linex);//获取 EXTI_ClearITPendingBit(EXTI_Linex);//清除 1 2 定时器 定时器中断 Tout= ((arr+1)*(psc+1))/Tclk; 初始化结构体初始化定时器中断的常用格式 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = xxx; TIM_TimeBaseStructure.TIM_Prescaler =xxx; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIVx; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_x; TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure); 使能定时器相应中断 TIM_ITConfig(TIMx,TIM_IT_Update,ENABLE );//更新中断 使能定时器 TIM_Cmd(TIMx, ENABLE); 中断服务状态 TIM_GetITStatus(EXTI_Linex);//获取 TIM_ClearITPendingBit(EXTI_Linex);//清除 中断服务函数 void TIMx_IRQHandler(void) { 。.. PWM输出 初始化结构体初始化输出比较的常用格式 TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWMx; //选择模式 PWM TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_xxx; //输出极性 TIM_OCxInit(TIMx, &TIM_OCInitStructure); //根据T指定的参数初始化外设 使能寄存器 TIM_OC1PreloadConfig(TIMx, TIM_OCPreload_Enable); //使能预装载寄存器 TIM_ARRPreloadConfig(TIMx,ENABLE);//ARPE 使能 1然后使能定时器。 修改占空比 TIM_SetComparex(TIMx,xxx);//在主程序中设置 特例:高级定时器使能输出 void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState) ADC 注意:IO 口设置模式为模拟输入,而不是复用功能 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN 设置 ADC 的通用控制寄存器 CCR( common control register) ADC_CommonInitTypeDef ADC_CommonInitStructure; ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式 ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_xCycles;//两个采样阶段之间的延迟周期数,5~20 ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//需保证 ADC1 的时钟频率不超过 36MHz。 ADC_CommonInit(&ADC_CommonInitStructure);//初始化 初始化结构体初始化ADC的常用格式 ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Resolution = ADC_Resolution_xb;//6,8,10,12 ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续模式 ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //禁止触发检测,使用软件触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐 ADC_InitStructure.ADC_NbrOfConversion = 1;//1 个转换在规则序列中 ADC_Init(ADC1, &ADC_InitStructure);//ADC 初始化 使能ADC ADC_Cmd(ADCx, ENABLE); 1 设置规则序列通道以及采样周期 ADC_RegularChannelConfig(ADCx, ADC_Channel_x, x, ADC_SampleTime_xCycles ); 1 软件开启ADC转换 ADC_SoftwareStartConvCmd(ADCx); 1 获取转换 ADC 转换结果数据 ADC_GetConversionValue(ADCx); |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1614 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1541 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
682 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1592 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 23:18 , Processed in 0.885569 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号