STM32编程遇到的问题随笔【一】

STM32编程遇到的问题随笔【一】

一、PB4引脚输出一直为高,无论怎么拉低都不起作用

原因PB4和PB3是复用引脚,用于JTAG调试,芯片是默认开启JTAG功能的,如果我们需要用到这两个引脚,必须降JTAG调试功能关闭,否则这两个引脚将无法当作普通IO来使用

如何关闭JTAG调试功能呢?将下面代码放在引脚初始化函数中,我的是驱动电机的,所以我放在函数:void MOTOR_Init(void)中。分为两个步骤,如下,

c 复制代码
//步骤1:首先要打开复用功能模块时钟
RCC_APB2PeriphClockCmd(	RCC_APB2Periph_AFIO, ENABLE);//	使能AFIO复用功能模块时钟

//步骤2:关闭复用功能
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关闭复用功能

二、利用Delay_ms函数延时,实际延时时间和设置的延时时间相差很大

Delay_ms函数如下:

c 复制代码
void Delay_ms(u16 nms)
{
	u32 temp;

	SysTick->LOAD = (u32)nms * fac_ms;//	时间加载(SysTick->LOAD为24bit)
	SysTick->VAL = 0;//	清空计数器
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;//	开始倒数
	do
	{
		temp = SysTick->CTRL;
	} while((temp & 0x01) && !(temp & (1 << 16)));//	等待时间到达
	SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;//	关闭计数器
	SysTick->VAL = 0;//	清空计数器
}

首先说明,我在主函数mian()函数中调用了这个Delay_ms()函数,同时在定时中断中也调用Delay_ms()函数,用于进行adc采集。其实问题就出在定时中断中调用了Delay_ms()函数,这个函数在主函数执行时,突然定时中断执行,导致Delay_ms()函数里面的变量的值被改变了,中断执行完毕之后,cpu再回来执行main函数的Delay_ms()时,Delay_ms()里面的变量已经被重新赋值了。

解决方法:

复制代码
方法1:禁用定时中断函数
方法2:去掉定时中断函数里面的延时函数Delay_ms()

三、adc通道的数据错乱,用到了DMA,通道1的跑到了通道2,通道2的跑到了通道1.

错误的代码:

c 复制代码
//	开启DMA传输
void DMA_Enable(DMA_Channel_TypeDef * DMA_CHx)
{
	DMA_Cmd(DMA1_Channel1, DISABLE);
	DMA_SetCurrDataCounter(DMA1_Channel1, 16);//	DMA通道缓存的大小  16
	DMA1_Channel1->CMAR = (u32)ADC_Temp;//	从DMA中读取数据

	DMA_Cmd(DMA1_Channel1, ENABLE);
}

需改后的函数:

c 复制代码
//	开启DMA传输
void DMA_Enable(DMA_Channel_TypeDef * DMA_CHx)
{
	DMA_Cmd(DMA1_Channel1, DISABLE);
	ADC_Cmd(ADC1, DISABLE);//必须加上这句话,失能ADC,不然会数据错位
	ADC_SoftwareStartConvCmd(ADC1, DISABLE);//	禁止ADC软件启动,但是adc并没有失能,所以还在继续采集及数据
	DMA_SetCurrDataCounter(DMA1_Channel1, 16);//	DMA通道缓存的大小  16
	DMA1_Channel1->CMAR = (u32)ADC_Temp;//	从DMA中读取数据
	
	DMA_Cmd(DMA1_Channel1, ENABLE);
	ADC_Cmd(ADC1, ENABLE);//在开启ADC
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使用软件转换启动功能	
}

原因猜测:

DMA传输数据需要消耗一定的时间,在传输最后一个数据时,adc还在转换,继续采集了下一个通道的数据,然后才被停止,才造成了错位。

c 复制代码
---晓凡  2024年11月14日于武汉书
相关推荐
单片机仿真设计2 小时前
【proteus仿真】基于 STC89C52 单片机家用智能台灯设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
2601_950790682 小时前
深圳国产单片机厂商怎么选?技术能力与服务能力检查表
单片机·嵌入式硬件·国产mcu·芯片厂商·深圳单片机·单片机选型
hongmai6668884 小时前
MP2348GTL-Z:这颗24V/4A同步降压芯片,把性能和体积平衡得恰到好处
c语言·开发语言·arm开发·单片机·5g
笨笨饿4 小时前
#135_代码中的类型重定义艺术:从基础封装到函数类型设计
开发语言·stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式实时数据库
西城微科方案开发5 小时前
高精度低功耗胎压计方案——气压表解决方案
单片机·嵌入式硬件
LavaLin016 小时前
STM32H562RGT6 与 STM32F722RET6 规格对比
stm32
VALENIAN瓦伦尼安教学设备6 小时前
设备状态检测振动分析实训台案例分析
大数据·数据库·人工智能·嵌入式硬件·算法
米饭不加菜6 小时前
一些常用模块简介
经验分享·笔记·嵌入式硬件
佳児素花痴╮7 小时前
STM32U575RIT6(USART)学习
stm32·嵌入式硬件·学习
小+不通文墨8 小时前
使用vscode里的U8G2 库编写OLED菜单控制
经验分享·笔记·单片机·嵌入式硬件·学习