EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1.ADC采用值转换成具体的物理量值
# F- e @- C& j, P0 n; C( jADC采样值在寄存器中是16位整形数据,要转换成具体的电压量,则必须进行换算。例如12位的转换精度,满量程的二进制为0000 1111 1111 1111,对应十进制数为1095,对应的电压为3.3V。所以计算公式为
1 R f6 W2 T* ?5 C2 r5 s3 c# X电压 = (采样二进制值/1096)*3.3(V)
p& Z: K* ~9 `* U! C特别注意,转换电压为浮点类型,所以要将采样二进制值强制转换成浮点型。 ' V7 c$ }, T J
uint16_t ADC_ConvertValue; float ADCtoVoltage;
; k! e; C; u& k& ]; x, Q+ f9 B, uADCtoVoltage = ((float)ADC_ConvertValue/4096)*3.3; 2.STM32F0x系列RCC配置
7 Y; J: x- P B1 H j& Z6 y /*!< 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 */ M' j3 }0 r( `% W
上面这句话的意思是说,RCC配置在启动文件中调用了system_stm32f0xx.c文件中的SystemInit()函数,该函数又调用了同一源文件中的SetSysClock()函数。SetSysClock的默认配置如下:
% u6 t8 x) s Q2 G3 [" w8 a①使能HSE,即外部晶振作为时钟来源;②PLL倍频为6,即若晶振为8MHz,则PLL输出频率为48MHz;③PLL作为系统时钟频率SYSCLK。④PCLK=HCLK=SYSCLK。 , P1 c' v4 O+ r0 ]
如果需要修改时钟配置,可以直接在这个函数中直接操作。具体的配置过程和代码参考该函数内容。 / {* {" L6 U( f0 D1 R' _
% U% I2 V- r1 L) ? ~ARM内核时钟最典型的运用是作为延时的时钟计时。不过注意,在使用延时计时功能前,必须对内核滴答时钟进行设置。
6 w5 Q8 e h) P- s//初始化延迟函数,注意,在使用后面的延时函数前,必须在主函数中调用该初始化函数。 //当使用ucos的时候,此函数会初始化ucos的时钟节拍 //SYSTICK的时钟固定为HCLK时钟的1/8 //SYSCLK:系统时钟 void DelayInit() { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8 fac_us=Syst EMCoreClock/8000000; //为系统时钟的1/8 fac_ms=(uint16_t)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数 }
; N- o" F i8 ^% Z//延时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传输采样值至内存 * m* f; E* y8 v' x2 u) f/ S K1 B' _) ~
F0的ADC在使用之前需要校准。这个7位的校准值也是放在ADC_DR中的,它也会触发DMA请求。可以参照F0的ADC-DMA例程,先做ADC校准、然后再设置DMA,再使能ADC的DMA。" ( f) m/ j! h: \4 ?5 y& c$ {" T+ }+ Q
5.字符串类型的变量定义
* C# x. W* ~3 ]# @; ], J, n假若我们这样声明:
, ?+ R- s, L, w, g* Munsigned char Astring; 则变量Astring代表的含义是一个字符串指针变量。本质上来说,在C语言中,字符串是一个字符数组,意思就是字符串是由各个单字节的字符组成,字符串用“”引用,字符用‘’引用。 4 }) n; d, b$ C' ]' r1 b
假若这样定义:
+ k1 z' m) h+ A* D5 j2 }unsigned char Astring = "ABCD"; 则这行代码是非法的。因为字符串不能直接赋值给字符串指针。正确的定义如下: 4 V& M. V7 X3 ~% ]0 z! c" D# {
unsigned char Astring[] = "ABCD"; //或者 unsigned char *Astring = "ABCD"; 这样则表示Astring指向字符串“ABCD”的起始地址,其中
% } |" J" b! @0 p6 s; J. E/ aAstring[0] = 'A'; Astring[1] = 'B'; Astring[2] = 'C'; Astring[3] = 'D';
; @& c+ B. x# n* x# X7 G' l |