别人写的你参考一下:半年前接触STM32,刚开始MCU用的32F1,库用的标准外设库35,写过一些简单的东西。再后来发现ST还有一个软件叫做STM32CUBEMX,可以自动的生成初始化程序,对于我这个32新手来说无疑是天降福音!终于不用为繁琐的配置而苦恼了(其实就是自己对各项配置不熟,而且没有自己积累的程序可以CtrlC+CtrlV)。虽然CUBE用的是ST新出的HAL库,与以前的标准外设库完全不兼容,甚至基本的I/O *** 作都变了,会让习惯了标准外设库的人很苦恼。但是我对标准外设库也不是很熟,而且CUBE的界面化设计真的让配置工程变得很方便,再加上它还有一个类似于FPGA的引脚分配界面,让资源分配,PCB布局布线也方便了不少,于是我选择了用CUBE,用HAL库。很早就开始的写32的朋友有不少,他们也试过HAL库,可最后无一例外都选择了继续使用标准外设库。他们表示完全不习惯HAL库,另外HAL库不太好,毕竟是自动生成的配置,没有自己手动配置的来得熟悉来得透彻,谁知道软件是怎么给你配置的工程。另外CUBE就是给那些不会写32的人用的(ST的官方的说法似乎也是HAL是为了方便做嵌入式相关且对底层不熟的人设计的,但想不通他为何要把两个库做得不兼容)。前面一直在画PCB,调PCB,做机械之类的,没有写程序。最近又开始写32,现在用的MCU是32F4,库是HAL/F4库160。可是我发现我连GPIO的上拉输出都实现不了,无论如何I/O始终默认输出低电平( *** 作I/O可以实现电平跳变),这个问题我昨天查了一天,从库到最底层的寄存器都看了,可没发现什么问题。周围用HAL库的就我一个。。。有些无奈了,难道HAL库真有什么问题吗?如果真有这么明显的问题,ST官方肯定早就发现了。已经下好了标准外设库,打算换标准外设库,工程从头到尾都自己配置,这样出了问题也更方便找。可是我始终有一点想不明白,既然ST官方在推HAL库,那肯定也有他的道理,我们也应该勇于接受新事物,为何身边的朋友却都不愿意接纳HAL库。
所谓库函数只是原厂为方便使用者开发方便而对MCU外设写的底层驱动而已,举个浅显的例子:以前用ATMEL单片机写程序你得查看每一个寄存器说明,而用上STM32库后,就基本不用看寄存器表了,只需了解函数的用法及规则即可,上手容易,开发直观简单。
进去后找到design support项,里面有各种支持的文档及相关资料。例程就在下面FIRMWARE栏中的“STM32F10x standard peripheral library”项,其实就是STM32的支持库,下载压缩包,里面会有库文件,启动文件,库例程等等,你说的例程序估计是库例程吧。其他系列的也是这种方法,一步步找就行
STM32点亮小灯(库函数版)
首先解释以下
#ifndef _LED_H
#ifndef _LED_H
#endif
避免重复引用头文件的内容。 一般放在头文件里面,作用就是以防你在c文件里面不小心重复包含头文件的时候不会报错
搞起来,搞起来。玩32其实点个灯是很难的,不像51,arduino等单片机
首先定义led库
/声明led库,防止在主函数中被重复调用/
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#endif
定义ledc文件
#include "ledh"
#include "stm32f10xh" //一定要采用这个库,才能调用引脚的初始化
//初始化PB5和PE5为输出口并使能这两个口的时钟
//LED IO初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体指针。具体百度
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA, ENABLE); //使能PB,PE端口时钟
GPIO_InitStructureGPIO_Pin = GPIO_Pin_5; //LED0-->PB5 端口配置
GPIO_InitStructureGPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB5
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB5 输出高
GPIO_InitStructureGPIO_Pin = GPIO_Pin_5; //LED0-->PB5 端口配置
GPIO_InitStructureGPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOB5
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE5 输出高
}
/主函数中/
#include "stm32f10xh" //一定要采用这个库,才能调用引脚的初始化
#include "delayh"
#include "ledh"
int main(void)
{
delay_init(); //初始化延时函数
LED_Init(); //初始化LED端口
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5); //LED0对应引脚GPIOB5拉低,亮 等同LED0=0;
GPIO_SetBits(GPIOA,GPIO_Pin_5); //LED1对应引脚GPIOE5拉高,灭 等同LED1=1;
delay_ms(300); //延时300ms
GPIO_SetBits(GPIOB,GPIO_Pin_5); //LED0对应引脚GPIOB5拉高,灭 等同LED0=1;
GPIO_ResetBits(GPIOA,GPIO_Pin_5); //LED1对应引脚GPIOE5拉低,亮 等同LED1=0;
delay_ms(300); //延时300ms
}
}
解释
/低电平输出模式/
GPIO_ResetBits(GPIOB,GPIO_Pin_5); //LED0对应引脚GPIOB5拉低,亮 等同LED0=0;
/高电平输出模式/
GPIO_SetBits(GPIOA,GPIO_Pin_5); //LED1对应引脚GPIOE5拉高,灭 等同LED1=1;
在线调试STM32 卡在LDR R0, = SystemInit_ExtMemCtl
程序卡在在线调试STM32 卡在LDR R0, = SystemInit_ExtMemCtl的解决办法如下:
出现最多的情况就是设置的 断点过多,可以把断点全部删除试试看 ,把断点设置在主函数。
在程序中使用了C库(printf),那么进入Option---target将usemicroLib勾选上。
硬件原因,主芯片,或者晶振有问题,更换一下就好了
不知道现在楼主解决了没有,其实出现这个问题,很大的可能是因为中断向量表被更改过造成的。楼主可以在整个工程中搜索一下这个宏“VECT_TAB_OFFSET”,正常情况下,如果是在flash中调试的话,那么整个宏应该是0的,如果你的那个工程是直接拿别人的过来改,那么,很有可能别人为了IAP或者是其他各种原因,会修改这个宏“VECT_TAB_OFFSET”的值,你只需要将它改为0即可,就像这样:#define VECT_TAB_OFFSET 0x0 ,如下图:
不可以,必须要启动文件,而且启动文件是汇编的,完成一些比较基本的软硬件初始化,比如初始化堆栈,或其他什么的,没有仔细研究过,当初始化完成后,汇编代码调用 main 函数,也就是调用C语言编写的程序,正式进入你所写的程序。
不相信的话你可以看看51单片机或其他的简单单片机,他们的反汇编代码,在main之前还有很多代码,就是完成这个步骤的,只不过他们都是在选择单片机型号后编译时自动添加进去了,不需要你写。
以上就是关于STM32HAL库写CAN通信程序最近遇到了难题,有谁有具体例子不全部的内容,包括:STM32HAL库写CAN通信程序最近遇到了难题,有谁有具体例子不、为什么只听说过stm32的库函数、stm32官网的程序案例怎么找等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)