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

embedded/2024/11/24 19:27:35/

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/embedded/139474.html

相关文章

C语言和C++的不同

C语言和C都是非常重要的编程语言&#xff0c;它们有着紧密的联系&#xff0c;但也存在显著的差异。以下是对C语言和C的一些主要异同的分析&#xff0c;以及对常用语句的对比。 1. 基本概念与用途 C语言&#xff1a;C语言是一种过程式编程语言&#xff0c;它提供了对低级内存操…

Ubuntu问题 - 显示ubuntu服务器上可用磁盘空间 一条命令df -h

目的 想要放我的 数据集 到新的ubuntu服务器中, 不知道存储空间够不够 开始 使用以下命令直接查看 df -h

【RK3588 Linux 5.x 内核编程】-内核线程

内核线程 文章目录 内核线程1、进程与线程介绍2、线程管理3、内核线程管理函数3.1 创建内核线程3.2 启动内核线程3.3 停止内核线程4、内核线程示例实现4.1 内核线程函数定义4.2 创建和启动内核线程4.3 停止内核线程4.4 完整示例代码5、驱动验证线程是并发处理中使用的编程抽象。…

.NET9 - 新功能体验(一)

被微软形容为“迄今为止最高效、最现代、最安全、最智能、性能最高的.NET版本”——.NET 9已经发布有一周了&#xff0c;今天想和大家一起体验一下新功能。 此次.NET 9在性能、安全性和功能等方面进行了大量改进&#xff0c;包含了数千项的修改&#xff0c;今天主要和大家一起体…

webstorm中 ‘@/**‘报 未安装模块 无法Ctrl定位

接触前端不深 学习中遇到这个问题 记录一下 创建一个名为 jsconfig.json 的文件 内容为以下 { "compilerOptions": {"baseUrl": "./","paths": {"/*": ["src/*"]}},"exclude": ["node_modul…

python读取Oracle库并生成API返回Json格式

一、安装必要的库 首先&#xff0c;确保已经安装了以下库&#xff1a; 有网模式 pip install flask pip install gevent pi install cx_Oracle离线模式&#xff1a; 下载地址&#xff1a;https://pypi.org/simple/flask/ # a. Flask Werkzeug-1.0.1-py2.py3-none-any.whl J…

前端反向代理的配置和實現

反向代理是位於客戶端和服務器之間的一個中間層&#xff0c;它代表客戶端向伺服器發起請求&#xff0c;然後將伺服器的回應返回給客戶端。與傳統的正向代理不同&#xff0c;反向代理是由伺服器端配置的&#xff0c;客戶端通常不知道它的存在。在前端開發中&#xff0c;反向代理…

GitLab 部署和配置指南

GitLab 部署和配置指南 1. GitLab 容器配置概述 在部署 GitLab 时&#xff0c;可能涉及以下几部分内容&#xff1a; 内置 Nginx 的配置和调整。HTTPS 证书的申请、使用和续期。通过 FRP 映射内网服务到外部服务器。阿里云服务器的 Nginx 配置和反向代理。 本文将完整涵盖这…