STM32经验心得

相关经验及心得如下: 
摘要:1.在配置USART的TX完成中断后,在没有发数的情况下自动进入TX完成中断函数。2 .在TX配置完成后,相应的TC标志位会自动置1,随后就进入了TX完成中断。3.相关配置程序编写无误,并已经开启时钟,依旧无法配置相关GPIO及外设;4.ADC通道:分为规则组和注入组;5.修改定时器的预装值后,定时器不能立刻修改。

一、 USART TX中断配置

  1. 问题描述:
    在配置USART的TX完成中断后,在没有发数的情况下自动进入TX完成中断函数。
    1

  2. 问题分析:
    在TX配置完成后,相应的TC标志位会自动置1,随后就进入了TX完成中断。
    1
    (TC标志位:发送完成标志位 )
    当包含有数据的一帧发送完成后,由硬件将该位置位。如果USART_CR1中的TCIE为1,则产生中断。由软件序列清除该位(先读USART_SR,然后写入USART_DR)。TC位也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。
    0:发送还未完成;
    1:发送完成成。

  3. 解决方法:
    a) 方案一: 先读状态寄存器(USART_SR) ,然后再DR发送寄存器中写数,TC标志位自动清除;
    1
    /** 用于清除TC标志位**/
    USART_GetFlagStatus(USART1, USART_IT_TC);
    USART1->DR=0x00;
    1
    2
    3
    b) 方案二:强行将SR寄存器的TC位写0,但是在实际运行过程中TC标志位不能立刻清零,需要增加一个延迟函数,才能使得TC标志位清零;
    1

4.其他补充

二、GPIO及外设配置无效

  1. 问题描述:
    相关配置程序编写无误,并已经开启时钟,依旧无法配置相关GPIO及外设;

  2. 问题分析:
    在调试过程运用IAR查看单片机相关的寄存器状态,发现相应的寄存器在运行配置程序后仍然没有反应,怀疑可能相应外设,没有启动,分析原因可能是没有时钟。

  3. 解决方法:
    在配置GPIO及外设之前就应该将开启相应的时钟;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //首先应该开启时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //首先应该开启时钟

/** TX --PA9 **/
GPIOInitStruct.GPIO_Mode= GPIO_Mode_AF_PP;
GPIOInitStruct.GPIO_Pin= GPIO_Pin_9;
GPIOInitStruct.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIOInitStruct);
1
2
3
4
5
6
7
三、 ADC通道
ADC通道:分为规则组和注入组

规则组:每次转换n个,直至所转换结束,无SEXT标志位;

注入组:每次转换一个,直至完成所有组员,有SEXT标志位;

四、 DMA通道配置
1、 问题描述:
配置的变量,在未修改的情况下改变;

2、问题分析:
变量在未修改的情况下改动,怀疑数据存在溢出,可能是因为指针、DMA配置有关。由于本次测试程序中没有运用数据指针,怀疑是DMA配置问题,查看DMA配置,发现

DMA_InitStruct.DMA_BufferSize =( DMATXLENGTHsizeof(int));
/

缓冲大小配置成数据所需要的的缓存空间大小,但实际这个函数配置的是数据的个数。上述的配置就导致了DMA的传输通道增加,指向了错误的变量地址;
*/
1
2
3
4
3、解决方法
DMA_InitStruct.DMA_BufferSize =DMATXLENGTH;
1
4、深入思考
DMA在某些情况下可以想象成运用指针直接给变量赋值、数组赋值等,因此在使用直接访问内存地址过程中要明确清晰的知道所指向的地址、该地址中对应数据所占空间的大小、所需要指向的数据个数等。尽量避免指针指错的现象。在某些使用DMA传输的数据,这些数据往往只随着源数据的变化而变化,在后续的数据调用中很少进行额外的改动,因此,在处理目的数据的时候,增加 const关键字进行修饰,可以有效的防止目的数据的意外更改。
1
五、 定时器PWM输出
1、问题描述:
修改定时器的预装值后,定时器不能立刻修改。

2、问题分析:
在仿真过程中查看寄存器,在修改预装值后寄存器的配置没有改变,而是完成一次后才做修改的。于是查看手册,需要修改相应寄存器 捕获/比较模式寄存器 2(TIMx_CCMR2) 中的OCxPE和OCxFE。
1

位3 OC3PE:输出比较3预装载使能
位2 OC3FE:输出比较3快速使能

3、解决方法:
直接运用指针修改寄存器相应的位的数值。

TIM3->CCMR2=  TIM3->CCMR2|0x0004;  //将OC3FE置1
TIM3->CCMR2=  TIM3->CCMR2&0xfff7;  //将OC3PE清零
TIM3->CCR3 = (u16) 0*00;           //向预装寄存器写值(CCR3寄存器)

作者:syt8945007
来源:CSDN
原文:https://blog.csdn.net/syt8945007/article/details/51972467
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(STM32经验心得)