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

news/2024/11/22 11:49:59/

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

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

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

在这里插入图片描述

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

//步骤1:首先要打开复用功能模块时钟
RCC_APB2PeriphClockCmd(	RCC_APB2Periph_AFIO, ENABLE);//	使能AFIO复用功能模块时钟//步骤2:关闭复用功能
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关闭复用功能

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

Delay_ms函数如下:

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.

错误的代码:

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

需改后的函数:

//	开启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通道缓存的大小  16DMA1_Channel1->CMAR = (u32)ADC_Temp;//	从DMA中读取数据DMA_Cmd(DMA1_Channel1, ENABLE);ADC_Cmd(ADC1, ENABLE);//在开启ADCADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使用软件转换启动功能	
}

原因猜测:

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

---晓凡  20241114日于武汉书

http://www.ppmy.cn/news/1549022.html

相关文章

11.21Scala

import java.io.PrintWriter import scala.io.Source object ddd1 {def main(args: Array[String]): Unit {//读入文件内容val content Source.fromFile("dd.txt").mkStringprintln(content)//2.把字符串拆分为一个一个的单词&#xff0c;保存到数组//正则表达式//…

java Map 遍历 详解

在 Java 中&#xff0c;Map 是一种键值对&#xff08;Key-Value&#xff09;形式存储数据的集合接口。遍历 Map 是日常开发中的常见需求。以下是遍历 Map 的详解&#xff0c;包括各种常见方式及其适用场景。 1. Map 的基本结构 在 Java 中&#xff0c;Map 提供了以下几种常用实…

docker是什么

Docker 是一个开源的平台&#xff0c;用于自动化开发、交付和运行应用程序。它利用容器化技术&#xff0c;将应用程序及其依赖项打包成一个独立的单元&#xff0c;称为容器。Docker 容器在任何环境中都能一致地运行&#xff0c;从而解决了“在我的机器上能正常工作”的问题。 …

FastJson反序列化漏洞(CVE-2017-18349)

漏洞原理 原理就不多说了&#xff0c;可以去看我这篇文章&#xff0c;已经写得很详细了。 Java安全—log4j日志&FastJson序列化&JNDI注入-CSDN博客 影响版本 FastJson<1.2.24 复现过程 这里我是用vulfocus.cn这个漏洞平台去复现的&#xff0c;比较方便&#x…

第二课 Model模型资源导入设置检查与优化

上期我们学习了最简单的audio音效的优化&#xff0c;接下来我们继续model模型资源的优化&#xff0c;我将汇总各路大神关于模型优化的思路和方法供你和我学习。 首先我们还是要把我们优化的目标重申一遍&#xff1a; 优化的目标 1.文件体积尽可能小 2.内存占用尽可能小 3.…

ES6 模板字符串详解

ES6 模板字符串详解 ES6&#xff08;ECMAScript 6&#xff09;引入了模板字符串&#xff08;Template Literals&#xff09;&#xff0c;这是一种新的字符串字面量语法&#xff0c;使用反引号&#xff08;&#xff09;来定义字符串。模板字符串不仅支持多行字符串&#xff0c;…

【十年java搬砖路】MYSQL xtrabackup 工具备份恢复

1.备份 xtrabackup 工具备份命令 xtrabackup --defaults-fileMYSQL配置文件地址(/etc/my.conf) --user用户名 --password密码 --backup --target-dir备份路径如(/data/mysql/backup) >>备份日存储地址(/data/mysql/backup/backup_full_success.log) 2>&12.恢复 …

五种算法B站视频推荐系统|vue+springboot前后端分离架构、多层感知机+矩阵奇异值分解+协同过滤四种推荐算法集成+机器学习预测算法、B站视频爬取

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 功能特色 &#x1fa77;编号&#xff1a;R08 &#x1fa77;架构&#xff1a;31架构&#xff0c;网站端大屏端管理端端后端,vuespringbotmysql &#x1fa77;功能&#xff1a;四…