Ⅰ 需要stm32的c语言设计程序
没学过单片机,有c语言枝首搜基础,是能芹世直接学习stm32的。因为STM32是基于专为要求高性能、低成本、低功耗的嵌入猛历式应用专门设计的ARM Cortex-0内核而设计的,属于高级单片机,其可以使用汇编语言编写程序,也可使用c语言编写程序,而且很多使用stm32单片机的人都是使用c语言编写程序,所以通过一本详细讲解stm32的书籍直接学习是完全可行的。
Ⅱ 学stm32需要哪些基础
学stm32主要是需要C语言基础知识,档氏和单片机基础知识。
stm32(中文名:嵌入式单片机)是意法半导体集团开发的一个系列的微控制器。其是专为要瞎大求高性能、低成本、低功耗的嵌入式应用而设计的。按内核架构分为不同产品:主流产品(STM32F0、STM32F1、STM32F3)、超低功耗产品(STM32L0、STM32L1、STM32L4、STM32L4+)、高性能产品(STM32F2、STM32F4、STM32F7、STM32H7)。
STM32的优点在于官方已经封装好了大多数基础的寄存器等数据,不需要逐一找地址。各种功能的使用只需调用相应函数即可。
学习STM32小技巧:
技巧1:AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速设备;
技巧2:Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为stm32f10x_conf.h专门控制外围器件的配置,也就是开关头文件的作用;
技巧3:HSE Osc(High Speed External Oscillator)高速外部晶振,一般为8MHz,HSI RC(High Speed InternalRC)高速内部RC,8MHz。
Ⅲ C语言可以开发单片机或者stm32的上位机吗
可以,Keil就可以
Ⅳ 不知有没有人对C++开发STM32感兴趣的,来讨论些问题
因为一开始我自学的就是C++,后来玩单片机以后才使用C语言来开芹伍派发东西,也写过一些程序了,
但是我的体会就是,C语言没有C++那么方便,最近才在学STM32,看到ARM编译器能够支持C++,挺爽的,就开始尝试把实验代码的工程改成C++的方式
出现了一些问题,我不太会查资料,网上讨论这个的也比较少,所以就发个帖子大家一起讨论下
先说一下,为什么要用C++,(说的可能不太清楚,对没学过C++的哥们就不好意思啊呃。。。)
1. 最简单的,函数重载, 这个语法特性就比C语言的好,还有运算符重载,这些都可以让代码变得更直观(这个等下我用我刚刚拓展的代码来演示一下)
2. 命名空间,C语言写大程序一般每个模块都会有个前缀,但是写起来麻烦,其实有时候在一个地方只会用到一个模块的内容,所以用using xxx::xxx感觉会比较方便些。
3. 类的支持,尤其是成员函数什么的使用起来方便,还有constructor,不用每次手动调用初始化。
(关于这个还是有一点问题我没有解决的,好像是全部类变量的初始化问题,我比较健忘,记不清了)
4.inline关键字,可以解决宏的一些缺陷 (有热心网友指出,用C也有__inline关键字)
5.引用参数的支持,比直接使用指针省事放心些
6.模板的支持,(这个在我之前发过的一个关于宏的帖子里有提到一点,也有提供代码,这个帖子的附件里面也有代码)
7.至少,网上说的,C++具有C的全部优点
关于我上面说的优点,也有网友对我的观点不屑,
有的说C++效率低下(关于这个我并不理解,因为我反汇编看过,没有明显的区别,除非你使用了继承多态的特性可能会有问题,
但是,在有些地方就需要使用这些特性,特别是在比较大的系统里,比如GUI,就算是用C语言去模拟面象对象的实现过程效率也是差不多的)
还有网友称C++的一些语法特性为语法糖,没多大用处(呵呵,这个就看个人喜好了,就像学过汇编的哥们可能就喜欢写汇编,不喜欢用C语言一样)
我也不打算说服所有的人,我只是希望有兴趣的人能和我一起交流意见,我之前发了那个帖子之后,就有一位华工刚毕业的师兄感兴趣,通过邮件和我交流
只可惜那个时候我一直没什么时间继续解决那些问题。趁这个下午有点时间,我就改了一下之前的代码,再到这里发帖,希望有兴趣橘猜的人能一起交流。
下面是我遇到的一些问题,有的已经解决,有的还没解决:
1. 以前的库函数怎么使用?
在函数声明前加上 extern "C" 就可以了,因为C++支持函数重载之类的东东,所以生成的目标代码的名字和C会有些不同,用extern "C"强制成C语言的名字规则。
现在新版本的库好像已经加上了,这里顺便问一下,新版本的库在官网的哪里下载?我不要一点就直接弹出下载的链接
新版的STM32的库的头文件前面是
#ifdef __cplusplus
extern "C" {
#endif
后面
#ifdef __cplusplus
}
#endif
这就是为了兼容C++的。
2. 中断函数进不去呀?
中断函数定义前也要加上 extern "C"。中断函数,名字已经固定了(在你使用MDK给的启动代码的情况下),
而C++对函数的生成的目标代码的命名方式和C语言不一样(为了支持重载),
然后我是以这种方式来解决的,
#define ARMAPI extern "C"
ARMAPI void EXTI15_10_IRQHandler(void)
{
...
}
3. 对库里面定义的结构体有警告: warning: #368-D: class "<unnamed>" defines no constructor to initialize the following:
这个没有关系的,我用这段代码屏蔽了中间警告
#ifdef __cplusplus
extern "C" {
//消除 warning: #368-D: class "<嫌贺unnamed>" defines no constructor to initialize the following:
#pragma diag_remark 368
#endif
...
...
#ifdef __cplusplus
//恢复368号警告
#pragma diag_default 368
}
4. C++有 new 关键字,类似C的malloc,但是这个是需要有内存管理提供动态内存的,这个在一个没有操作系统的MCU上咋整呀?
其实关于使用C++的,国外已经有成功的例子了(只是IDE用的不是MDK。。。),我从网友提供的链接去下载了源代码:
http://andybrown.me.uk/ws/2011/12/28/stm32plus-a-c-library-for-stm32-development/
(PS:看了他们的代码库,我发现我以前写的文件系统实在是弱啊。。。没关系,会继续完善的)
人家是这么搞的,利用函数重载,重载了new操作符,(软件仿真会跳进重载的函数里)
,自己只要提供malloc和free以及堆的一些初始化就行了(这个一般要上了OS才有内存管理的吧。。。)
/* * Implement C++ new/delete operators using the heap */
void *operator new(size_t size)
{ return malloc(size); }
void *operator new[](size_t size)
{ return malloc(size); }
void operator delete(void *p)
{ free(p); }
void operator delete[](void *p)
{ free(p); }
还有些没解决的问题
5. 定义全局类变量后会有错误:
..\output\stm32test.axf: Error: L6218E: Undefined symbol __cpp_initialize__aeabi_ (referred from anon$$obj.o).
class A
{
public :
A()
{
int x, y;
x = 5;
y = 7;
x = y;
y = x + 8;
}
};
A a;
有些地方可能不清楚,原帖子在这个链接:
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=5401612&bbs_page_no=1&search_mode=3&search_text=Pony279&bbs_id=9999
然后是我刚刚做的设置IO口模式的几个函数的测试代码,因为实现代码比较长,我不会帖上来,
在附件里面有完整的代码,测试代码在gpio_test_120309a.cpp文件里,相关的代码全部在 MYLIB文件夹里面也有。
(自己在学习的时候整理的函数都在那里面,其实内容比较少。。。)
我这里只是为了演示使用的便利性的提高和代码的阅读性的提高。
SetMode函数实现是利用了函数重载的,和默认参数。如果不知道什么是重载的,先不要去想语法,直接看代码,看得懂不?
int main(void)
{
{using namespace gpio; //在这个代码block里面使用gpio的命名空间。
SetMode(GPIOA, Pin(0), OUTPUT); //设置PA0为输出模式,有默认参数 开漏输出, 这里没有写出来
SetMode(GPIOA, Pin(1), OUTPUT, OPEN_DRAIN, _50M);
SetMode(GPIOA, Pin(2), OUTPUT, PUSH_PULL, _50M);
SetMode(GPIOA, Pin(3), INPUT); //有默认参数,上拉输入,没有写出来。
SetMode(GPIOA, Pin(8), INPUT, PULL, DOWN);
SetMode(GPIOB, Pin(3), INPUT);
SetMode(GPIOB, Pin(8), INPUT, PULL, DOWN);
}
//仿真结果和预期一致。
while(1);
}
函数重载是语法上允许同名函数的存在,但是需要这两个函数的参数列表是不同的,使用的时候,编译器会知道你要调用的是哪个函数。
在写代码的时候对于一个同样功能但是参数类型不同的函数,如果需要起不同的名字,不论是写代码还是读代码都会比较痛苦的,
我上面好像提了几次代码的阅读性的问题,因为我一直很重视代码的阅读性,这一点从我之前发的那个关于宏的帖子大家也可以知道。
因为,我想老鸟应该有体会,其实程序猿花在读代码上的时间,是远大于写代码的时间的。
好像扯远了。。。就先到这里吧。。。
Ⅳ c语言51,stm32等单片机程序的大专是什么专业
计算机专业。C语言是一门面坦或向过程的、抽象化的通用程序设计锋和语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储银信盯器。
Ⅵ stm32用什么语言编程
现在困耐普遍都是使用keil的环境下,c语言编模尺指程。旦配都有库函数,直接调用库函数就方便多了。汇编也可以,不过维护性不好。还有就是你可以去用stm32 cube这个工具图形化编程,更加方便简单了
Ⅶ 利用stm32的单片机完成下面的要求,程序该怎么写,用C语言
用两个定时器分别对两个LED灯闪烁,KEY1和KEY2要设置为外部中断输入,当进入中断时KEY1_DANG或KEY2_DANG指向下一个档位,并且发送串口。给你提供点思路。
void main()
{
while(1)
{
if(key1_dang==0x01)
中断定时1设置为0.2秒
if(key1_dang==0x02)
中断定时1设置为0.4秒
if(key1_dang==0x03)
中断定时1设置为0.6秒
if(key1_dang==0x04)
中断定时1设置为0.8秒
if(key1_dang==0x05)
中断定时1设置为1.0秒
if(key2_dang==0x01)
中断定时2设置为0.2秒
if(key2_dang==0x02)
中断定时2设置为0.4秒
if(key2_dang==0x03)
中断定时2设置为0.6秒
if(key2_dang==0x04)
中断定时2设置为0.8秒
if(key2_dang==0x05)
中断定时2设置为1.0秒
}
}
Ⅷ 如何快速的学会单片机C语言编程
很多想学单片机的人问我的第一句话就是怎样才能学好单片机?对于这个问题我今天就我自己是如何开始学单片机,如何开始上手,如何开始熟练这个过程给大家讲讲。
先说说单片机,一般我们现在用的比较多的的MCS-51的单片机,它的资料比较多,用的人也很多,市场也很大。就我个人的体会怎么样才能更快的学会单片机这门课。单片机这门课是一项非常重视动手实践的科目,不能总是看书,但是学习它首先必须得看书,因为从书中你需要大概了解一下,单片机的各个功能寄存器,而说明白点,我们使用单片机就是用软件去控制单片机的各个功能寄存器,再说明白点,就是控制单片机那些管脚的电平什么时候输出高,什么时候输出低。由这些高低电平的变化来控制你的系统板,实现我们需要的各个功能。至于看书,只需大概了解单片机各管脚都是干什么的?能实现什么样的功能?第一次,第二次你可能看不明白,但这不要紧,因为还缺少实际的感观认识。所以我总是说,学单片机看书看两三天的就够了,看小说你一天能看五六本,看单片机你两三天看两三遍就够了,可以不用仔细的看。推荐一本书,就这一本就足够,书名是《新编MCS-51单片机应用设计》,是哈尔滨工业大学出版社出的的,作者是张毅刚。大概了解一下书上的内容,然后实践,这是非常关键的,如果说学单片机你不实践那是不可能学会的,关于实践有两种方法你可以选择,一种方法:你自己花钱买一块单片机的学习板,不要求功能太全的,对于初学者来说你买功能非常多的那种板子,上面有很多东西你这辈子都用不着,我建议有流水灯、数码管、独立键盘、矩阵键盘、AD或DA(原理一样)、液晶、蜂鸣器,这就差不多了。如果上面我提到的这些,你能熟练应用,那可以说对于单片机方面的硬件你已经入门了,剩下的就是自己练习设计电路,不断的积累经验。只要过了第一关,后面的路就好走多了,万事开头难,大家可能都听过。方法二:你身边如果有单片机方面的高手,向他求助,让他帮你搭个简单的最小系统板。对于高手来说,做个单片机的最小系统板只需要一分钟的时间,而对于初学者可就难多了,因为只有对硬件了解了,才能熟练运用。而如果你身边没有这样的高手,又找不到可以帮助你的人,那我劝你最好是自己买上一块,毕竟自己有一块要方便的多,以后做单片机类的小实验时都能用得上,还省事。
有了单片机学习板之后你就要多练习,最好是自己有台电脑,一天少看电影,少打游戏,把学习板和电脑连好,打开调试软件坐在电脑前,先学会怎么用调试软件,然后从最简单的流水灯实验做起,等你能让那八个流水灯按照你的意愿随意流动时你已经入门了,你会发现单片机是多么迷人的东西啊,太好玩了,这不是在学习知识,而是在玩,当你编写的程序按你的意愿实现时你比做什么事都开心,你会上瘾的,真的。做电子类的人真的会上瘾。然后让数码管亮起来,这两项会了后,你已经不能自拔了,你已经开始考虑你这辈子要走哪一行了。就是要这样练习,在写程序的时候你肯定会遇到很多问题,而这时你再去翻书找,或是问别人,当得到解答后你会记住一辈子的,知识必须用于现实生活中,解决实际问题,这样才能发挥它的作用,你自己好好想想,上了这么多年大学,天天上课,你在课堂上学到了什么?是不是为了期末考试而忙碌呢?考完得了90分,哈哈哈好高兴啊,下学期开学回来忘的一干二净,是不是?你学到什么了?但是我告诉你单片机一旦学会,永远不会忘了。另外我再说说用汇编和C语言编程的问题。很多同学大一二就开设了C语言的课,我也上过,我知道那时天天就是几乘几,几加几啊,求个阶乘啊。学完了有什么用?让你用C语言编单片机的程序你是不是就傻了?书上的东西我们必须要会运用。单片机编程用C语言或汇编语言都可以,但是我建议用C语言比较好,如果原来有C语言的基础那学起来会更好,如果没有,也可以边学单片机边学C语言,C语言也挺简单,只是一门工具而已,我劝你最好学会,将来肯定用得着,要不你以后也得学,你一点汇编都不会根本无所谓,但你一点C语言都不会那你将来会吃苦头。汇编写程序代码效率高,但相对难度较大,而且很罗嗦,尤其是遇到算法方面的问题时,根本是麻烦的不得了,现在单片机的主频在不断的提高,我们完全不需要那么高效率的代码,因为有高频率的时钟,单片机的ROM也在不断的提高,足够装得下你用C语言写的任何代码,C语言的资料又多又好找,将来可移植性非常好,只需要变一个IO口写个温度传感器的程序在哪里都能用,所以我劝大家用C语言。
总结上面,只要你有信心,做事能坚持到底,有不成功不放弃的强烈意志,那学个单片机来说就是件非常容易的事。
步骤:1.找本书大概了解一下单片机结构,大概了解就行。不用都看懂,又不让你出书的。(三天)
2.找学习板练习编写程序,学单片机就是练编程序,遇到不会的再问人或查书。 (二十天)
3.自己网上找些小电路类的资料练习设计外围电路。焊好后自己调试,熟悉过程。 (十天)
4.自己完全设计具有个人风格的电路,产品,。。。你已经是高手了。 。。。。
看到了吗?下功夫一个多月你就能成为高手,我就讲这么多了,学不学得会,下不下得了功夫就看你的了。
参考资料:
Ⅸ 用c语言开发stm32和开发其他东西感觉不太一样吧
首先得要看你做的东西有多复杂,所写的代码能有多大。
“人有多大力就办多大事”,STM32的功能远比51、AVR之类的单片机要强大得多,相对来说开发的产品功能比较大,代码也会比较复杂。
首先有完整的框架是非常必须的,我个人认为这里的框架有两层,一个是在STM32上移植现有的操作系统或者一些稳定的代码框架,另外一个是自己的编程风格。
你想很方便的开发相对复杂的东西,建议你首先在STM32上移植一个小型操作系统或一种框架,然后在操作系统之上编写你自己的应用去开发产品。在没有操作系统或框架的情况下开发是非常麻烦的事情。要做到条理清晰的话,那就应该去迎合操作系统或框架的风格去编写代码,这答案并不唯一。 举个简单例子,现在比较热门的STM32F103或STM32F407开发产品,一般会移植一个ucosii或rt-thread操作系统(当然也有移植linux或android的,但我个人很少见),ucosii我没实际开发过我就不说了,像rt-thread这样的实时操作系统,它具有多任务编程,那么我们就需要迎合它的特点,比如我串口作为一个线程,LCD、LED扫描作为一个线程,数据采集作为一个线程,键盘扫描作为一个线程等等,在他们的线程中只各自做自己的事情,然后在增加一个顶层的线程专门来负责处理其他线程所产生的消息事件(或者给其他各线程发送消息事件),顶层的线程是作为一个中心处理线程来合理安排和处理其他各个线程的消息事件。
至于在这方面的提升,只能是通过实践来达到效果,这里的“实践”不是说要完全自己去摸索,你需要有东西来借鉴,因为现在一些操作系统、或框架、或编程风格都是比较成熟,你直接拿来看,看看别人是怎么写的代码,然后自己再去仿照着能不能写的出来,再分析里面的优缺点。你要是还在学校且资源有限,建议你可以花个几百块钱上淘宝买一个开发板,一般的开发板都有各个外设的实验,以及综合实验,或许还会有操作系统或框架的移植和使用。
Ⅹ stm32单片机c语言详解
32单片机随缘的详解就是根据你常规的单片机语言进行调整。