完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前言
提示:f10x32寄存器配置集锦,持续更新。 提示:以下是本篇文章正文内容,下面案例仅供参考 一、GPIOx x可选 A ~ E。 PB12举例, //清除位 GPIOB -> CRH &= ~( 0xf << 16) ; //输出,50M GPIOB -> CRH |= 3 << 16 ; //通用推挽输出,PB12 举例 GPIOB -> CRH &= ~( 3 << 18) ; 输出: GPIOB -> ODR |= (1 << 12 ); //输出高 GPIOB -> ODR &= ~(1 << 12 ); //输出低 二、通用定时器 TIM3举例: //arr = 10000 psc = 7199 一秒 void my_Tim3_Init(u16 arr , u16 psc) { NVIC_InitTypeDef my_NVICStruct; //开启TIM3时钟 RCC -> APB1ENR |= 1 << 1; TIM3 -> ARR = arr; TIM3 -> PSC = psc; //允许中断 TIM3 -> DIER |= 1<<0; TIM3 -> CR1 |= 0x01; //启动 //中断分组、优先级 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); my_NVICStruct.NVIC_IRQChannel = TIM3_IRQn; my_NVICStruct.NVIC_IRQChannelPreemptionPriority = 0; my_NVICStruct.NVIC_IRQChannelSubPriority = 2; my_NVICStruct.NVIC_IRQChannelCmd = ENABLE ; //初始化中断 NVIC_Init(&my_NVICStruct); } 调用: Tim3_Init(10000,7199); //时间1s 服务函数: void TIM3_IRQHandler(void) { if(TIM3 -> SR &0x0001) // 1s { //代码 } TIM3 -> SR =~ (1<<0); } 可以不使用中断函数,而直接查询标志位: //arr = 10000 psc = 7199 一秒 void my_Tim3_Init(u16 arr , u16 psc) { NVIC_InitTypeDef my_NVICStruct; //开启TIM3时钟 RCC -> APB1ENR |= 1 << 1; TIM3 -> ARR = arr; TIM3 -> PSC = psc; TIM3 -> CR1 |= 0x01; //启动 } 调用: Tim3_Init(10000,7199); main函数: while(1) if(TIM3 -> SR &0x0001) // 1s { //代码 TIM3 -> SR &= ~(1<<0); } @2 PWM RCC->APB1ENR|=1<<1; TIM3 -> ARR = arr; TIM3 -> PSC = psc; TIM3 -> CCMR1 |= 7 << 12; //CH2 PWM2模式 TIM3 -> CCMR1 |= 1 << 11; //CH2预装载使能 TIM3 -> CCER |= 1 << 4; //OC2 输出使能 TIM3 -> CR1 = 0x8000; //ARPE使能 TIM3 -> CR1|= 0x01; //使能定时器3 /## @2带刹车的PWM 三、 DMA 这里假设数组到SPI1发送,那么我们的RegAddr = *Array,PeriphAddr = SPI1_BASE + 0x0C,之前一直不成功,出现TEIF。是因为SPI的地址弄错了,就是DR的地址。当然出现错误的原因还有其他的,比如由于数据在不同的SRAM就会存在DMA访问不到地址的情况,也会出现TEIF。 void my_DMA_Init(DMA_Channel_TypeDef * DMAx ,u32 *RegAddr ,u32 PeriphAddr ,u32 len) { DMAx -> CMAR = RegAddr; DMAx -> CPAR = PeriphAddr; DMAx -> CNDTR = len; //数据长度 DMAx -> CCR &= 0x0000; DMAx -> CCR |= 1 << 13; //高等优先级 DMAx -> CCR |= 1 << 7; //存储器地址增量 DMAx -> CCR |= 1 << 4; //从存储器读 } 开始传输: DMAx -> CCR &= ~(1<<0); DMAx -> CNDTR = len; DMAx -> CCR |= 0x01; SPI1 -> CR2 |= 0x02; 四、IWDG(独立看门狗) void my_Iwdg_Init() { IWDG->KR = 0x5555; //允许写寄存器 IWDG->PR = 16; //预分配因子 IWDG->RLR = 2048; //预装载值 IWDG->KR = 0xAAAA; //喂狗 IWDG->KR = 0xCCCC; //使能看门狗 } 喂狗 : IWDG->KR = 0xAAAA; 注意两个寄存器,PR和RLR,一个3位取值0 ~ 7。一个12位取值0 ~ 4095 做实验需要先关闭硬狗,在烧录软件设置。 五、WWDG(窗口看门狗) 六、ADC void my_ADC_Init(void) { NVIC_InitTypeDef my_NVICStruct; RCC -> APB2ENR |= (1 << 9); RCC -> APB2ENR |= (1 << 0); //使能ADC1的时钟 和中断复用时钟 RCC -> APB2RSTR |= (1 << 9); //时钟复位 RCC -> APB2RSTR&=~(1<<9); //重新开启 RCC -> CFGR &= ~(3 << 14); RCC -> CFGR |= 1 << 15; //设置6分频 12M ADC1 -> CR1 |= 1 <<5; //允许转换结束的中断 EOC ADC1 -> CR1 &= ~(0xf << 16); //独立模式 ADC1 -> CR1 &= ~(7 << 13) ; //使用一个通道 ADC1 -> CR2 |= 1 << 20; //使用外部触发,先使用软件触发 ADC1 -> CR2 &= ~(7 << 17); ADC1 -> CR2 |= (7 << 17); // 111 SWSTART ADC1 -> CR2 &= ~(1 << 11); //使用右对齐 ADC1 -> CR2 &= ~(1 << 1); //单次转换 ADC1 -> SQR1 &= ~(0xf << 20); //一个转换序列 ADC1 -> SMPR2 &= ~(7 << 18); ADC1 -> SMPR2 |= (7 << 18); //采样周期55.5 //中断分组、优先级 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); my_NVICStruct.NVIC_IRQChannel = ADC1_2_IRQn; my_NVICStruct.NVIC_IRQChannelPreemptionPriority = 1; my_NVICStruct.NVIC_IRQChannelSubPriority = 1; my_NVICStruct.NVIC_IRQChannelCmd = ENABLE ; //初始化中断 NVIC_Init(&my_NVICStruct); } 中断服务函数: void ADC1_2_IRQHandler(void) { if(ADC1 ->SR & 0x2) { Get_ADC_Conversion(); } ADC1 ->SR &= ~(1 << 1); } 开始采集一次: void ADC_gather() { ADC1 -> SQR3 |= 0; ADC1 -> CR2 |= 1 << 22; ADC1 -> CR2 |= (1 << 0); //采集 } 得到采集的值: void Get_ADC_Conversion(u8 ch) { u32 adcx = 0; ADC1 -> SQR3 &= 0XFFFFFFE0; //规则序列1 通道ch ADC1 -> SQR3 |= ch; ADC1 -> CR2|=1<<22; //启动规则转换通道 while(!(ADC1 -> SR & 1 << 1)); //等待转换结束 adcx = ADC1->DR; return adcx; } 二、端口复用 端口复用 AFIO -> MAPR &= ~(7 <<24) //1、清除[26 : 24] AFIO -> MAPR |= 4 << 24 ; //2、关闭JTAG-DP,关闭SW-DP //CAN 复用 AFIO -> MAPR &= ~(3 << 13); //清除[14 : 13] //可选 *AFIO -> MAPR |= 1 << 13 ; // 01:未用组合 *AFIO -> MAPR |= 0 << 13 ; //00:CANRX映像到PA11,CANTX映像到PA12 *AFIO -> MAPR |= 2 << 13 ; // 10:CANRX映像到PB8,CANTX映像到PB9(不能用于36脚的封装) *AFIO -> MAPR |= 3 << 13 ; //11:CANRX映像到PD0,CANTX映像到PD1(只适用于100脚的封装) //定时器4复用 AFIO -> MAPR |= 1 << 12; //完全映像 (TIM4_CH1/PD12 , TIM4_CH2/PD13 , TIM4_CH3/ |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1952 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1734 浏览 1 评论
1203 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
795 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1761 浏览 2 评论
2008浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
850浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
295浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
649浏览 3评论
651浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-10 07:57 , Processed in 0.569906 second(s), Total 44, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号