找回密码
 注册
关于网站域名变更的通知
查看: 61|回复: 0
打印 上一主题 下一主题

stm32使用过程中的注意事项

[复制链接]

该用户从未签到

跳转到指定楼层
1#
 楼主| 发表于 2024-7-3 14:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
1.ADC采用值转换成具体的物理量值
# ^! |" N# w5 J* m5 d9 O
ADC采样值在寄存器中是16位整形数据,要转换成具体的电压量,则必须进行换算。例如12位的转换精度,满量程的二进制为0000 1111 1111 1111,对应十进制数为1095,对应的电压为3.3V。所以计算公式为
1 E7 L; Q& I  o% @- t
电压 = (采样二进制值/1096)*3.3(V)

; |7 Z& }! z0 d
特别注意,转换电压为浮点类型,所以要将采样二进制值强制转换成浮点型。
% A/ k% k7 K3 j" @$ g
uint16_t  ADC_ConvertValue;
float     ADCtoVoltage;

7 p  D- c6 t/ G# h
ADCtoVoltage = ((float)ADC_ConvertValue/4096)*3.3;
2.STM32F0x系列RCC配置
- ~. v+ @& t+ X  C" l0 G
/*!< At this stage the microcontroller clock setting is already configured,this is done through SystemInit() function which is called from startup file (startup_stm32f0xx.s) before to branch to application main.To reconfigure the default setting of SystemInit() function, refer to system_stm32f0xx.c file */
" N: X8 K: [' i  U. Y: `, O: \
上面这句话的意思是说,RCC配置在启动文件中调用了system_stm32f0xx.c文件中的SystemInit()函数,该函数又调用了同一源文件中的SetSysClock()函数。SetSysClock的默认配置如下:
8 q6 M7 a% e( ?1 p+ u
①使能HSE,即外部晶振作为时钟来源;②PLL倍频为6,即若晶振为8MHz,则PLL输出频率为48MHz;③PLL作为系统时钟频率SYSCLK。④PCLK=HCLK=SYSCLK。

+ w: S! c! x, I  ~
如果需要修改时钟配置,可以直接在这个函数中直接操作。具体的配置过程和代码参考该函数内容。

+ H5 U0 P! V( j; `6 d  ?- s
3.利用ARM m-内核(CPU)的滴答时钟延时

) Z" [' X; Q4 G9 M9 f" f1 M, g
ARM内核时钟最典型的运用是作为延时的时钟计时。不过注意,在使用延时计时功能前,必须对内核滴答时钟进行设置。
+ j9 a5 O4 F* [+ V1 f: ?5 Z
//初始化延迟函数,注意,在使用后面的延时函数前,必须在主函数中调用该初始化函数。
//当使用ucos的时候,此函数会初始化ucos的时钟节拍
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
void DelayInit()
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        //选择外部时钟  HCLK/8
fac_us=SystEMCoreClock/8000000;        //为系统时钟的1/8  
fac_ms=(uint16_t)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数   
}
% S- @  V" W  y7 V, w; D
//延时nus
//nus为要延时的us数.               
void DelayUs(unsigned long nus)
{
uint32_t temp;             
SysTick->LOAD=nus*fac_us; //时间加载,加载寄存器          
SysTick->VAL=0x00;        //清空计数器,计数寄存器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数,控制寄存器         
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
SysTick->VAL =0X00;       //清空计数器         
}
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
void DelayMs(unsigned int nms)
{
uint32_t temp;
SysTick->LOAD=(uint32_t)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00;           //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数  
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
SysTick->VAL =0X00;       //清空计数器
}
4.ADC经DMA传输采样值至内存
0 p: y4 T) }7 A" v; p) i
F0的ADC在使用之前需要校准。这个7位的校准值也是放在ADC_DR中的,它也会触发DMA请求。可以参照F0的ADC-DMA例程,先做ADC校准、然后再设置DMA,再使能ADC的DMA。"
& W4 c* T4 |9 e  `% ]' m+ o9 x
5.字符串类型的变量定义
/ X4 x) f8 r& H& S! q- _( }5 [3 s
假若我们这样声明:
7 e7 |8 j0 j) Z/ t/ j! k/ `. G
unsigned char Astring;
则变量Astring代表的含义是一个字符串指针变量。本质上来说,在C语言中,字符串是一个字符数组,意思就是字符串是由各个单字节的字符组成,字符串用“”引用,字符用‘’引用。

0 b! B2 v9 F0 f* }1 Z
假若这样定义:

7 |/ \* \. X! B$ K9 I# E
unsigned char Astring = "ABCD";
则这行代码是非法的。因为字符串不能直接赋值给字符串指针。正确的定义如下:

' T# O. _# a8 v
unsigned char Astring[] = "ABCD";
//或者
unsigned char *Astring = "ABCD";
这样则表示Astring指向字符串“ABCD”的起始地址,其中
- V6 V# L. |5 M
Astring[0] = 'A';
Astring[1] = 'B';
Astring[2] = 'C';
Astring[3] = 'D';
3 x: d4 k8 ?8 Z4 s' e  |/ P  e
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-18 21:27 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表