- 常见问题
- STM32主函数执行三次
- 原因
- 解决方法
- 烧录进STM32,STM32就自动运行
- 原因
- 解决方法
- 程序不运行
- 原因
- 解决方法
- 无法使用strncmp与strcmp
- 原因
- 解决方法
- 无法使用PB4或PB3
- 原因
- 解决办法
- 不能使用PB4和PB5的PWM功能
- 问题
- 解决方法
- 进入不了CAN接收中断
- 原因
- 解决方法
- 常用技巧
- 对比两个字符数组的 前n位是否一样
- 16进制、8进制和整形的相互转换
- 软件复位
- uint32_t( u32)、 uint16_t( u16)、uint8_t( u8)分别占几个字节
- STM32——查看系统时钟的简单方法
- 后续
在编写STM32程序时发现,主函数中没有循环,但是程序自动运行了3次,查找资料,最后得以解决。
原因嵌入式软件不同于PC机下编程,PC下写C语言从main函数返回的话,是会返回操作系统的,所以不会出错。而对于裸机不应该退出MAIN函数,不然会出现错误,这种错误叫with no expectation of returning。
解决方法如果不需要循环,也要在最后加上
while(1)
{;}
烧录进STM32,STM32就自动运行
原因
在设置中,选择了自动运行。
解决方法点击魔法棒 - >点击Debug - >点击右上角的Settings->选择Flash Download->取消Reset and …
可能是不小心更改了Flash 起始地址
解决方法点击魔法棒 - >Target->更改IROM1后面地址为0x08000000
没有引用对应头文件
解决方法添加 #include
无法使用PB4或PB3 原因最近用STM32F103T8做项目,发现PB3和PB4这两个IO不可控。 查询手册发现原因是PB3和PB4在系统复位时候,分别默认为SYS_JIDO和SYS_HJTRST; 所以需要通过用户自行禁止其功能; 也就是想要正常使用PB3和PB4的主功能的时候。需要进行设置。
解决办法在初始化IO时候,增加代码如下:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);
总体初始化代码结构如下:
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB, GPIO_Pin_4);
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
不能使用PB4和PB5的PWM功能
问题
端口复用
解决方法 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//这句表示关闭jtag,使能swd。
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
进入不了CAN接收中断
原因
- 有可能是初始化时没开启CAN中断
- 如果没有配置过滤器,也可能会导致进入不了CAN的接收中断。
- 在CAN初始化的最后加上开启CAN接收中断
- 配置过滤器
我们在开发中肯定使用过strcmp(s1,s2),用来对比字符串s1和s2是否一致。但有时候,我们并不需要对比整个数组,而只需要对比前n位是否一致,这时候我们可以使用:strncmp(s1,s2,n)函数。 strcmp(s1,s2)是两个字符串从左到右逐个字符比较大小,当出现第一个不相同的字符时就比较出大小了,按ASCII比较,如果两个字符串相等,则结果为0;如果前一个字符串大于第二个,则结果为正整数;如果前一个字符串小于第二个,则结果为负整数;
strncmp(s1,s2,n)函数是两个函数比较前n个字符的大小,在前n个字符中比较规则与strcmp函数相同,如果两个字符串相等,结果为0;如果前一个字符串大于第二个,结果为正整数;如果前一个小于第二个,结果为负整数;
strncmp函数是指定比较size个字符,strcmp函数比较整个字符,直到出现不同的字符或遇"\0"为止,最后一个’\0‘也要比较。
16进制、8进制和整形的相互转换我们在开发中,经常会使用到uint32_t( u32)、 uint16_t( u16)、uint8_t( u8)的相互转换。 在开发中往往采用如下方式。 a=(要转换成的类型)b; 如下程序为将u16类型的a转换成int赋值给b
u16 a=0x10;
int b;
b=(int)a;
printf(" b=%d\r\n",b);
软件复位
有时,我们在编写程序时,遇到一些特殊情况需要复位,但是并不是任何时候我们都可以手动复位,这时候我们可以在程序里设定个软件复位。
/*******************复位************************/
__set_FAULTMASK(1);
NVIC_SystemReset();
或者:
__disable_fault_irq();
NVIC_SystemReset();
/**********************************************/
uint32_t( u32)、 uint16_t( u16)、uint8_t( u8)分别占几个字节
uint32_t(u32) :四个字节 uint16_t(u16) :两个字节 uint8_t ( u8 ) :一个字节
STM32——查看系统时钟的简单方法- 在主函数开始加入这两行代码`
RCC_ClocksTypeDef get_rcc_clock;
RCC_GetClocksFreq(&get_rcc_clock);
- 将开发板与电脑用J-link或者st-link连接起来,开启调试模式
- 将get_rcc_clock变成watch1观察变量
- 将断点加在自己代码的后面某一行
- 运行代码
- 即可观察时钟值(将十六进制换算成10进制数,方便查看)
如果想了解更多物联网、智能家居项目知识,可以关注我的项目实战专栏。 或者关注公众号观看更多。
编写不易,感谢支持。