stm32c语言编程技巧,Stm32编译自己总结的技巧(可能适应于任何keil编译)

1.定义的函数名字和数组名字不能相同,否则报错

2.定义无参函数的时候要加void

否则加上函数声明的时候在编译的时候会出现警告

3.任何函数  必须首先进行变量声明,然后才能是可执行的语句(declaration

may not appear after  executable statement in block)

4.内核中断可以硬件自己清标志位,外设中断必须手动(软件)清标志位

5.定义变量的时候,如果不预先赋初值,则初始值就不一定是0;对于初值有要求的,一定要定义的时候赋值,切记!

6.同一中断线上的中断口只能用一个,比如PA1和PB1只能用一个但是可以选择进中断后判断电平来计算

7.keil工程路径不能太深,而且名字(每一层文件夹名字)不能过长,否则不能进入debug或者进入之后不能正常调试。

8.如果可以进debug。但是不能打断点,尝试将工程配置恢复默认(下面的default),同时删除自动生成的所有文件,重新试一下,曾经这样成功过(用st—link2),具体原因不明。(后发现是接触不良,同时断点数量不能过多)

9.中断初始化的时候如果出现死在NVIC_Init(&NVIC_InitStructure);这一句上面,很有可能是无限进中断,因为第一次进中断貌似和配置没有关系,而且有些中断如果不清中断标志位,则会一直进,所以一定在中断服务函数里面清中断标志位。特别是TIM定时器。

10.预处理指令中使用了反斜杠\,这里解释一下:每一条预处理语句总是以"#"字符开始,并且不能超过一行,一旦遇到换行符语句就被当做结束,唯一的一种能将预处理语句扩展到多行的办法就是在换行符之前加一个反斜杠('\')。

11.定义指针,一定要先初始化,否则意想不到的后果。

12.stm32

spi1和spi的通用的配置函数,spi1比spi2快一倍,因此可能影响传输距离和速度(测试于sd卡通信得知)

13.keil如果无法打断点,而且是全部不能打断点,可能是勾选了Download to

Flash;(位置:Debug—》setting--》(debug选项卡右下角))

14.stm32在系统初始化之前最好加个延时,否则可能会出错(一般都是电源不稳定,复位电路不稳定造成的),这个延时只能是for循环延时,在系统做任何操作之前,此只是为解决办法,并不是根本原因。原则上讲,电路应该做一个RC复位电路,上电之前复位。

15. 如果出现编译不报错,但是就是有个红X提醒,可以把C99模式去掉编译下,再改回来就好了

16.KEIL MDK  中是否勾选使用 micro

lib,可能会影响时序。调试RC522时候,模拟spi,其他通讯正常,在使用读写卡两个函数的时候,必须勾选才可以

17.STM32F0系列的对于stlink的线要求不能过长,可能驱动不起来,能检测到不代表就能用.

18.目前测试串口收发测试的时候,如果打个断点(keil中),到了断点暂停之后,如果串口在暂停状态下接收数据,那么继续运行之后将会死在串口接收中断里面,而且还查不到中断标识,传说是stm32的bug,在此标记(用的芯片stm32f030f4p6)

19.今天调试51的程序的时候,发现串口中断里面不要加入发送中断的判断和设置,否则,至少现在发现定时器和串口不能同时使用的问题.

20.同上,也是串口的问题,半个月之后发现新问题,因为这个串口协议时序要求比较强,一直会偶尔出现接收到错误的数据,后来在串口发送之前加上ES=0;发送完后ES=1;就ok了,意思就是发送过程中禁止串口中断;

21.在485总线上,任何时刻都只能有一个主机发送数据,而且其他485芯片必须处于接收状态,即使处于发送状态但是不发送数据也不行,否则会造成数据错误!

22.在进行判断语句的时候,c语言中==是比|(或),&(与)这些优先级高的,所以if(0==a&b)和if(0==(a&b))这两个是不一样的.

23.如果程序调试的时候点运行就闪一下,死到systemint里面,应该是断点打太多了;

24.一旦出现下载失败,异常的情况,优先检查复位电路!

25.485收发测试的时候一定要注意A,B线上的电容,千万不能过大;

26.STM32F030系列RTC没有后备电池供应引脚,即VBAT引脚.

27.STM32因为时钟问题,在修改比较低的波特率的时候要特别注意(比如本次要修改usart1的波特率为600,那么就

要将apb2的分别多设置一点,降低总线频率,才能设置成功,RCC_PCLK2Config(RCC_HCLK_Div4);)

28.TTL转485电路,记得要在TXD加上上拉电阻!否则调试的时候收到数据可能全为0(测试芯片MAX13487,其他应该类似);

29.Flash等待周期对于Stm32芯片,不同的运行频率可能影响性能,之前有文章测试因为没有规范设计等待周期,导

致芯片高温情况下死机的现象!

30.STM32usb接口在使用的时候切记加入ESD防护,

31.写程序的时候要特别注意内存溢出的问题,否则可能导致数据错乱;

a4c26d1e5885305701be709a3d33442f.png

上面这段程序TpicData[]只定义到TpicData[9],而实际运算过程中却可能多出来,如果不加if(temp1小于lowfloor)

continue;这个数组里面某个元素值会变化,但是实际却没有给它赋值;加上这个判断后,异常消失;

32.mfrc522调试过程中发现,当使用单天线的时候,软件配置成单天线方案,即SetBitMask(TxControlReg,0x02);相对较明显的提高读写卡效果;

33.在串口接收中断里判断当前接收的数据量是否超过缓存的最大值,之前的程序没有做这个处理,极容易出现数组溢出的问题(此次造成其他数组里的值错误);

34.MDK中 sprintf 输出浮点数据出错,很有可能是使用uscosii操作系统中没有做

8字节对齐是原因,解决办法就是堆栈数组强制为8字节对齐:

__align(8)

static  OS_STK

AppTaskStartStk[APP_TASK_START_STK_SIZE];

详细解释参考:https://www.amobbs.com/thread-3258924-1-1.html

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Keil5和STM32C103的按键点灯示例代码: 首先,在Keil5创建一个新的STM32C103工程,并将下面的代码复制到main.c文件: ``` #include "stm32f10x.h" void Delay(uint32_t nCount); int main(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOA clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* Configure PA0 as input */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Enable GPIOC clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); /* Configure PC13 as output */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); while(1) { /* Check if button is pressed */ if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET) { /* Turn on LED */ GPIO_SetBits(GPIOC, GPIO_Pin_13); } else { /* Turn off LED */ GPIO_ResetBits(GPIOC, GPIO_Pin_13); } /* Delay */ Delay(100000); } } void Delay(uint32_t nCount) { for(; nCount != 0; nCount--); } ``` 该代码初始化了PA0为输入,PC13为输出,并在while循环检查PA0的状态。如果PA0为低电平(即按钮被按下),则点亮PC13上的LED,否则熄灭LED。 需要注意的是,该代码使用了一个简单的延迟函数Delay(),其实现如下: ``` void Delay(uint32_t nCount) { for(; nCount != 0; nCount--); } ``` 该函数使用循环来等待一定的时间。在实际应用,应该使用更加精确的延迟函数,例如SysTick定时器或定时器断等。 编译并下载程序到STM32C103,连接按键和LED,即可测试按键点灯功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值