最简单的C程序(STM32版的helloworld)

}
}
simple.ld
SECTIONS { . = 0x0; .text : { *(.text) }
}
Makefile
PREFIX := arm-none-eabi.PHONY: all clean
all: blink.bin blink.o: blink.c
$(PREFIX)gcc -mcpu=cortex-m3 -mthumb -nostartfiles -c blink.c -o blink.o blink.out: blink.o simple.ld
接下来分析要操作那些寄存器,并确定这些寄存器的值。 1. 使能 D 号 GPIO 端口的时钟 2. 配置 D 号 GPIO 端口的脚 9(PD9)为通用推拉输出模式(General purpose output push-pull) 3. 交替设置 PD9 的值为 0 和 1,控制 LED 灯的亮灭 寄存器的确定就要查 ST 的手册了 • APB2 peripheral clock enable register(RCC_APB2ENR)
最简单的 C 程序(STM32 版的 helloworld)
下面开始讨论如何在 STM32 上写一个最简单的程序,会谈到程序执行的细节,原理,如何编程,如何编译及链 接我们写的程序,如何通过 OpenOCD 把程序烧写到 STM32 芯片内部的 Flash 上,如何执行等。
程序的运行方式
开始写之前,先说说最简单的 C 程序是如何运行的。 为了程序足够简单,我们可以让 CPU 直接从 FLASH 上取指令并执行,而且程序中没有全局变量,因此编译出来 的目标文件中是数据段长度是 0,这样避免了初始化 RAM 的步骤,因为数据段是可读写的,如果目标文件中有数据 段,我们就必须在程序的启动过程中,将数据段复制到 RAM 中,才能确保程序的正常工作。
• MSP(栈顶指针)初始值 • PC 初始值(LSB 必须为 1) • 程序的代码段,数据段等 下面的代码就能达到我们的目的
__asm__(".word 0x20001000"); __asm__(".word main"); main() {
在以上代码中,我们指定 MSP 为 0x20001000,即栈大小为(0x20001000-0x20000000=0x1000), 对我们这么小的程序而言,4k 大小的栈应该绰绰有余了。需要指出的是,GNU 的 tool chain 能自动帮我们处理 好 PC 初始值 LSB 必须为 1 的问题,我们只要保证“main”是一个 C 函数就行。其实,这个跟我们写 PC 上的程序 还是有点区别的,函数名字其实是可以任意起的,这里起为“main”其实也是为了方便理解起见。毕竟,我们没有 利用 tool chain 的启动代码,也就没有必要按 tool chain 的要求来命名主函数了。
; 0x4002
.......
看到了吧,逻辑起始地址是 0x00000000,栈指针 MSP 是 0x20001000,PC 初始值是
0x00000009,GNU tool chain 自动帮忙处理好了 LSB 必须为 1 的问题。
细心的读者应该会去看看编译出来的目标文件中都有那些段了。在我的电脑上测试的结果中,只 有”.text”,”.comment”,”.ARM.attributes”三个段,其中跟程序的执行相关的只有".text”段。在更复杂的程 序中,还会有“.rodata”,”.data”和”.bss”段。另外用户也可以自己定义段。对这些不同段的处理,以后会有更 详细的描述。
亮灯:GPIOD9 输出低电平,BR9 = 1 灭灯:GPIOD9 输出高电平,BS9 = 1 至此,程序的实现细节都已经清除了,那就开始编程吧,happy programming!
程序代码分析
我们写的第一个程序如此简单,干脆就把它贴在正文里了吧。
blink.c
#define GPIOD_CRH (*((volatile unsigned long*)(0x40011400 + 0x4))) #define GPIOD_BSRR (*((volatile unsigned long*)(0x40011400 + 0x10))) #define RCC_APB2ENR (*((volatile unsigned long*)(0x40021000 + 0x18)))
地址:0x40021000 + 0x18 复位后的值:0x00000000
把(IOPD EN)设为 1 即可使能 GPIOD 的时钟 • Port configuration register high (GPIOx_CRH)(x=D)
地址:0x40011400 + 0x4 复位后的值:0x44444444
__asm__(".word 0x20001000"); __asm__(".word main"); main() {
unsigned int c = 0;
RCC_APB2ENR = (1 << 5); //IOPDEN = 1 GPIOD_CRH = 0x44444414;
while(1) { GPIOD_BSRR = (1 << 25); // ON for(c = 0; c < 100000; c++); GPIOD_BSRR = (1 << 9); // OFF for(c = 0; c < 100000; c++);
再来看看要烧到 Flash 中的二进制文件吧。
#od -t x1 blink.bin 0000000 00 10 00 20 09 00 00 00 80 b4 83 b0 00 af 4f f0 0000020 00 03 7b 60 41 f2 18 03 c4 f2 02 03 4f f0 20 02 0000040 1a 60 41 f2 04 43 c4 f2 01 03 44 f2 14 42 c4 f2 0000060 44 42 1a 60 41 f2 10 43 c4 f2 01 03 4f f0 00 72 0000100 1a 60 4f f0 00 03 7b 60 03 e0 7b 68 03 f1 01 03 0000120 7b 60 7a 68 48 f2 9f 63 c0 f2 01 03 9a 42 f4 d9 0000140 41 f2 10 43 c4 f2 01 03 4f f4 00 72 1a 60 4f f0 0000160 00 03 7b 60 03 e0 7b 68 03 f1 01 03 7b 60 7a 68
有了这三个文件,我们只需在终端敲“make”命令,make 程序就会帮忙把程序的镜像“blink.bin”做出来 了。既然程序这么简单,编译出来的结果也不会太复杂,来一起分析一下吧。
先来反汇编一把
#arm-none-eabi-objdump -D blink.out
下面是结果的片段:
blink.out:
地址处取值。 以上是 ARM 对 CortexM3 核定义的行为,那 ST 作为芯片的制造商,是如何实现的呢?再来查查 ST 的参考手 册吧。 从 ST 的 Reference Manual 中,我们可以查到 STM32 系列处理器的引导模式设置和不同的模式下处理器的 行为。我们所关心的就是最简单的情况,从内置的 Flash 启动,也就是 BOOT0=0 的情况。 刚才已经提到了,内置的 Flash 起始地址是 0x08000000,这岂不是意味着 Cortex M3 无法从 Flash 中取得 复位后需要的 MSP 初始值和 PC 初始值了?STM32 对此的解决方案是地址别名,内置的 Flash 有两套地址空间, 除了能从 0x08000000 访问外,从别名(从 0x00000000 开始)也能访问。 基于以上的分析,我们来总结一下我们程序的 image 该存放哪些信息。
程序的运行环境
我们来定义一下程序执行时的存储器映射(memory map) FLASH
RAM
0x20001000 栈顶
0x08000000 (0x00000000)
0x20000000
FLASH 的阴影区域表示保存的程序镜像,程序执行过程中的栈当然只能是在 RAM 中,示意图中标出了栈顶指 针。
Байду номын сангаас复位后程序的运行流程
push {r7}
a: b083
sub
sp, #12
c: af00
add
r7, sp, #0
e: f04f 0300 12: 607b
mov.w r3, #0
str
r3, [r7, #4]
14: f241 0318
movw r3, #4120
; 0x1018
18: f2c4 0302
movt r3, #16386
接下来,就该分析实现功能的程序怎么干活的了。
程序都干了些啥
程序再简单,也不能没有输出啊。可是在嵌入式系统中,可没有屏幕输出 helloworld,因此我们只能落入俗 套,来玩点灯游戏吧。
为了点灯,程序需要操作那些外设呢?操作这些外设需要读写那些寄存器呢? 由于点灯程序“过于”简单,我们只需要操作 STM32 的 GPIO 就可达到目的。对 GPIO 的操作涉及到的几个寄存器 我们可以查阅 ST 提供的使用手册得到具体信息,还要结合自己开发板的硬件电路来确定寄存器的值。在本人的开 发板上,D 号 GPIO 的 9 脚连着一个 LED 灯,就用它了! 下图即为点灯相关的原理图,程序运行的效果就是 LED(DS4)不停的闪烁。
file format elf32-littlearm
Disassembly of section .text:
00000000 <main-0x8>: 0: 20001000 4: 00000009
合集下载

hellocode简单编程代码

hellocode简单编程代码

hellocorld简单编程代码在计算机编程中,Hello World程序是一个非常基础的程序,用于向初学者展示如何编写一个简单的程序。

下面是一个使用不同编程语言编写的Hello World程序示例。

一、C语言版```c#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}```解释:* `#include <stdio.h>`:这一行包含了标准输入输出头文件,它包含了`printf`函数的声明。

* `int main()`:这是程序的主函数,程序的执行从这里开始。

* `printf("Hello, World!\n");`:这一行会在屏幕上打印出"Hello, World!"。

`\n`表示换行。

* `return 0;`:表示程序正常结束。

二、Python版```pythonprint("Hello, World!")```解释:* `print("Hello, World!")`:这一行会在屏幕上打印出"Hello, World!"。

三、Java版```javapublic class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");}}```解释:* `public class HelloWorld`:定义了一个公共类HelloWorld。

在Java中,每个程序都必须有一个主类。

* `public static void main(String[] args)`:这是程序的主函数,Java程序的执行从这里开始。

`main`方法必须声明为`public`和`static`,因为它是程序的入口点。

Helloworld!(内含自己编写的C语言二叉树同学录)

Helloworld!(内含自己编写的C语言二叉树同学录)

Helloworld!(内含⾃⼰编写的C语⾔⼆叉树同学录) 修改:刷了⼀段时间的题,⽔平渐涨,发现同学录真的要做成市⾯可⾏的应⽤的话,应该按学号建⽴⼆叉平衡树,红⿊树是⼀个可⾏的选择。

 在同学的推荐下,来到博客园来找志同道合的⼈交流代码。

3个⽉后参加蓝桥杯⽐赛,报名的是C语⾔组,所以接下来3个⽉我会在此发布刷题时的⼼得与原创代码。

以下代码是我的课程设计⾃⼰花12⼩时编写的⼆叉树同学录。

反思⼀下⾃⼰的代码,删除节点⽤了取巧的办法,并没有完全删除节点内信息,仅仅是将学号数组第⼀个字符设为空,没有释放节点与接下来的连接节点。

为什么⽤⼆叉树,并没有掌握精髓,应该是要⽤⼆叉排序树按学号排序,这样搜索起来就快了。

不过因为仅仅是课程设计,也没⼼思真的去做⼀个很完美的程序。

另外代码中有⼀段重复使⽤率⽐较⾼,也没去单独编⼀个函数,没有使⽤⽤C语⾔中字符串相关的函数,初学者也能弄懂。

有兴趣的同学可以交流⼀下。

最后庆祝⼀下!第⼀次开通博客园账户,第⼀次写博客,感觉还是挺新奇的哈哈。

1 #include<stdio.h>2 #include<stdlib.h>3 typedef struct Student_node4 {5char number[20];6char name[20];7char sex[20];8char telephone[20];9char interest[100];10char favourite_sentence[1000];11struct Student_node *left;12struct Student_node *right;13 }student_node,*student;14int n,k,flagf=1,flagd=1,flaga=1,c=0,insert;15char findnumber[20];16void init(student *stu)17 {18 *stu=NULL;19 }20int make_student(student *stu)21 {22int i;23char t;24if(k==0)25 {26 *stu=NULL;27return0;28 }29 printf("当前节点有值则输⼊1,⽆值则输⼊0\n");30 scanf("\n%c",&t);31if(t=='0')32 *stu=NULL;33else if(t=='1')34 {35 *stu=(student)malloc(sizeof(student_node));36 printf("输⼊学号\n");37 scanf("\n%c",&t);38 (*stu)->number[0]=t;39for(i=1;t!='\n';i++)40 {41 scanf("%c",&t);42 (*stu)->number[i]=t;43 }44 t='\0';45 printf("输⼊名字\n");46for(i=0;t!='\n';i++)47 {48 scanf("%c",&t);49 (*stu)->name[i]=t;50 }51 t='\0';52 printf("输⼊性别\n");53for(i=0;t!='\n';i++)54 {55 scanf("%c",&t);56 (*stu)->sex[i]=t;57 }58 t='\0';59 printf("输⼊电话\n");60for(i=0;t!='\n';i++)61 {62 scanf("%c",&t);63 (*stu)->telephone[i]=t;64 }65 t='\0';66 printf("输⼊兴趣、爱好\n");67for(i=0;t!='\n';i++)68 {69 scanf("%c",&t);70 (*stu)->interest[i]=t;71 }72 t='\0';73 printf("输⼊座右铭\n");74for(i=0;t!='\n';i++)75 {76 scanf("%c",&t);77 (*stu)->favourite_sentence[i]=t;78 }79 t='\0';80 k--;81 make_student(&((*stu)->left));82 make_student(&((*stu)->right));83 }84return0;85 }86int show_student(student stu)87 {88int i;89if(k==0)90return0;91if(stu!=NULL)92 {93if(stu->number[0]!='\0')94 {95for(i=0;stu->number[i]!='\n';i++)96 printf("%c",stu->number[i]);97 printf("\n");98for(i=0;stu->name[i]!='\n';i++)99 printf("%c",stu->name[i]);100 printf("\n");101for(i=0;stu->sex[i]!='\n';i++)102 printf("%c",stu->sex[i]);103 printf("\n");104for(i=0;stu->telephone[i]!='\n';i++)105 printf("%c",stu->telephone[i]);106 printf("\n");107for(i=0;stu->interest[i]!='\n';i++)108 printf("%c",stu->interest[i]);109 printf("\n");110for(i=0;stu->favourite_sentence[i]!='\n';i++) 111 printf("%c",stu->favourite_sentence[i]); 112 printf("\n");113 printf("-----------------\n");114 }115 k--;116 show_student(stu->left);117 show_student(stu->right);118 }119return0;120 }121int find(student stu)122 {123int i,flag=0;124if(k==0)125return0;126if(stu!=NULL)127 {128 k--;129for(i=0;stu->number[i]!='\n'||findnumber[i]!='\n';i++) 130 {131if(findnumber[i]!=stu->number[i])132 {133 flag=1;134break;135 }136 }137if(!flag&&stu->number[i]==findnumber[i])138 {139 flagf=0;140for(i=0;stu->number[i]!='\n';i++)141 printf("%c",stu->number[i]);142 printf("\n");143for(i=0;stu->name[i]!='\n';i++)144 printf("%c",stu->name[i]);145 printf("\n");146for(i=0;stu->sex[i]!='\n';i++)147 printf("%c",stu->sex[i]);148 printf("\n");149for(i=0;stu->telephone[i]!='\n';i++)150 printf("%c",stu->telephone[i]);151 printf("\n");152for(i=0;stu->interest[i]!='\n';i++)153 printf("%c",stu->interest[i]);154 printf("\n");155for(i=0;stu->favourite_sentence[i]!='\n';i++)156 printf("%c",stu->favourite_sentence[i]);157 printf("\n");158 printf("-----------------\n");159return0;160 }161else162 {163 find(stu->left);164 find(stu->right);165 }166 }167return0;168 }169int delete_student(student *stu)170 {171int i,flag=0;172if(k==0)173return0;174if((*stu)!=NULL)175 {176 k--;177for(i=0;(*stu)->number[i]!='\n'||findnumber[i]!='\n';i++) 178 {179if(findnumber[i]!=(*stu)->number[i])180 {181 flag=1;182break;183 }184 }185if(!flag&&(*stu)->number[i]==findnumber[i])186 {187 flagd=0;188 (*stu)->number[0]='\0';189return0;190 }191else192 {193 delete_student(&((*stu)->left));194 delete_student(&((*stu)->right));195 }196 }197return0;198 }199int add_student(student *stu)200 {201int i;202char t;203if(k==0)204return0;205if((*stu)!=NULL)206 {207if((*stu)->number[0]=='\0')208 {209 flaga=0;210 printf("输⼊学号\n");211 scanf("\n%c",&t);212 (*stu)->number[0]=t;213for(i=1;t!='\n';i++)214 {215 scanf("%c",&t);216 (*stu)->number[i]=t;217 }218 t='\0';219 printf("输⼊名字\n");220for(i=0;t!='\n';i++)221 {222 scanf("%c",&t);223 (*stu)->name[i]=t;224 }225 t='\0';226 printf("输⼊性别\n");227for(i=0;t!='\n';i++)228 {229 scanf("%c",&t);230 (*stu)->sex[i]=t;231 }232 t='\0';233 printf("输⼊电话\n");234for(i=0;t!='\n';i++)235 {236 scanf("%c",&t);237 (*stu)->telephone[i]=t;238 }239 t='\0';240 printf("输⼊兴趣、爱好\n");241for(i=0;t!='\n';i++)242 {243 scanf("%c",&t);244 (*stu)->interest[i]=t;245 }246 t='\0';247 printf("输⼊座右铭\n");248for(i=0;t!='\n';i++)249 {250 scanf("%c",&t);251 (*stu)->favourite_sentence[i]=t; 252 }253 t='\0';254return0;255 }256else257 {258 add_student(&((*stu)->left));259 add_student(&((*stu)->right));260 }261 }262return0;263 }264int can_insert(student stu)265 {266if(stu!=NULL)267 {268 c++;269if(stu->left==NULL||stu->right==NULL) 270 {271 printf("%d ",c);272 can_insert(stu->left);273 can_insert(stu->right);274 }275else276 {277 can_insert(stu->left);278 can_insert(stu->right);279 }280 }281return0;282 }283void creat(student *stu)284 {285int i;286char t;287 *stu=(student)malloc(sizeof(student_node)); 288 n++;289 printf("输⼊学号\n");290 scanf("\n%c",&t);291 (*stu)->number[0]=t;292for(i=1;t!='\n';i++)293 {294 scanf("%c",&t);295 (*stu)->number[i]=t;296 }297 t='\0';298 printf("输⼊名字\n");299for(i=0;t!='\n';i++)300 {301 scanf("%c",&t);302 (*stu)->name[i]=t;303 }304 t='\0';305 printf("输⼊性别\n");306for(i=0;t!='\n';i++)307 {308 scanf("%c",&t);309 (*stu)->sex[i]=t;310 }311 t='\0';312 printf("输⼊电话\n");313for(i=0;t!='\n';i++)314 {315 scanf("%c",&t);316 (*stu)->telephone[i]=t;317 }318 t='\0';319 printf("输⼊兴趣、爱好\n");320for(i=0;t!='\n';i++)321 {322 scanf("%c",&t);323 (*stu)->interest[i]=t;324 }325 t='\0';326 printf("输⼊座右铭\n");327for(i=0;t!='\n';i++)328 {329 scanf("%c",&t);330 (*stu)->favourite_sentence[i]=t;331 }332 t='\0';333 init(&((*stu)->left));334 init(&(*stu)->right);335 }336int creat_student(student *stu)337 {338int x;339if(stu!=NULL)340 {341 c++;342if(c==insert)343 {344if((*stu)->left==NULL&&(*stu)->right==NULL)345 {346 printf("插⼊左节点请输⼊0,插⼊右节点请输⼊1\n");347 scanf("%d",&x);348if(!x)349 {350 creat(&((*stu)->left));351return0;352 }353else354 {355 creat(&((*stu)->right));356return0;357 }358 }359else if((*stu)->left==NULL)360 {361 printf("插⼊左节点\n");362 creat(&((*stu)->left));363return0;364 }365else if((*stu)->right==NULL)366 {367 printf("插⼊右节点\n");368 creat(&((*stu)->right));369return0;370 }371 }372else373 {374if((*stu)->left!=NULL)375 creat_student(&((*stu)->left));376if((*stu)->right!=NULL)377 creat_student(&((*stu)->right));378 }379 }380return0;381 }382int main()383 {384char x;385int i,key=0;386 student stu;387 printf("***************************创建同学录***************************\n"); 388 printf("学⽣个数\n");389 scanf("%d",&n);390 k=n;391 make_student(&stu);392 system("pause");393while(key!=5)394 {395 system("cls");396 printf("|***********************************************************|\n"); 397 printf("|**************************同学录***************************|\n"); 398 printf("|***********************************************************|\n\n\n"); 399 printf("1、遍历输出 2、查找 3、删除 4、增加 5、退出程序\n"); 400 scanf("%d",&key);401if(key==1)402 {403 k=n;404 printf("学号、姓名、性别、电话、爱好、座右铭\n-----------------\n"); 405 show_student(stu);406 }407if(key==2)408 {409 printf("请输⼊要查找的学⽣的学号\n");410 k=n;411 scanf("\n%c",&x);412 findnumber[0]=x;413for(i=1;x!='\n';i++)414 {415 scanf("%c",&x);416 findnumber[i]=x;417 }418 printf("学号、姓名、性别、电话、爱好、座右铭\n-----------------\n"); 419 find(stu);420if(flagf)421 printf("查⽆此⼈!\n");422 flagf=1;423 }424if(key==3)425 {426 printf("请输⼊要删除的学⽣的学号\n");427 k=n;428 scanf("\n%c",&x);429 findnumber[0]=x;430for(i=1;x!='\n';i++)431 {432 scanf("%c",&x);433 findnumber[i]=x;434 }435 delete_student(&stu);436if(flagd)437 printf("输⼊学号不正确,删除失败!\n");438else439 printf("删除成功!\n");440 flagd=1;441 }442if(key==4)443 {444 k=n;445 add_student(&stu);446if(flaga)447 {448 c=0;449 printf("以下节点可供插⼊\n");450 can_insert(stu);451 printf("\n");452 printf("插⼊到哪个节点之下?\n");453 scanf("%d",&insert);454 c=0;455 creat_student(&stu);456 }457 flaga=1;458 }459if(key==5)460 {461 exit(0);462 }463 system("pause");464 }465return0;466 }。

stm32电灯最简单代码

stm32电灯最简单代码

stm32电灯最简单代码在学习STM32单片机时,我们常常会选择最简单的例子进行学习和实践。

其中之一就是通过STM32实现一个简单的电灯控制,下面就是这个最简单的STM32电灯控制代码。

首先,需要在工程中添加头文件和宏定义:```#include 'stm32f10x.h'#define LED GPIO_Pin_13```其中,stm32f10x.h是STM32标准库中的头文件,GPIO_Pin_13表示LED所在引脚的编号。

然后,需要进行GPIO的初始化:```GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = LED;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);```其中,RCC_APB2PeriphClockCmd是时钟使能函数,将GPIOC的时钟开启;GPIO_InitStructure是GPIO初始化结构体,其中GPIO_Pin表示要初始化的引脚,GPIO_Mode表示引脚模式为输出模式,GPIO_Speed表示引脚速度为50MHz,GPIO_Init表示初始化。

最后,就是控制LED灯的代码:```while(1){GPIO_SetBits(GPIOC, LED); //LED亮Delay(0xFFFFF);GPIO_ResetBits(GPIOC, LED); //LED灭Delay(0xFFFFF);}```其中,GPIO_SetBits表示将LED引脚设置为高电平,GPIO_ResetBits表示将LED引脚设置为低电平,Delay是延时函数,0xFFFFF表示延时时间。

一个简单的C程序

一个简单的C程序

执行部分:由若干个语句组成。
c=a+b; (3)一个c程序总是从main函数开始执行的,而不论main函数在整个 程序中的位置如何; (4)c程序书写格式自由,一行内可以写几个语句,一个语句可以分 写在多行上,c程序没有行号。 (5)每个语句和数据声明的最后必须有一个分号,分号是c语言的必要 组成部分;分号是不可缺少的,即使是程序中最后一个语句要也应包 含分号; (6)c语言本身没有输入输出语句。输入和输出的操作是由库函数 scanf和printf等函数来完成的。 (7)可以用/* */对c程序中的任何部分做注释。一个好的、有使用价值 的源程序都应当加上必要的注释,以增加程序的可读性。
一个简单的C程序
#include <stdio.h> void main() { printf(“hello,world”); } 本程序的输入结果是:hello,world
解读该程序: main()是函数的名字,表示主函数; Void表示此函数是“空类型”,即执行此函数后不产生一个函数值 有的函数执行后会得到一个函数值,比如sin(x); 每一个c语言都必须有一个main函数; 函数体由{}括起来; printf()是c编译系统提供的标准函数库中的输出函数。
#include<stdio.h> #include<math.h> void main() { int x,y; scanf(“%d”,&x); y=sqrt(x); pr
算法:为解决一个问题而采取的方法和步骤。 方法有优劣之分,步骤的多少 为了有效地进行解题,不仅需要保证算法正确,还要考虑算法的质量,选择 合适的算法; 计算机算法可分为两大类别: 1 数字运算算法,目的是求数值解; 2 非数值运算算法:包括的面非常广泛,最常见的是用于事物管理领域; 算法举例: 求5! 5!=1*2*3*4*5 常规算法: 步骤1:先求1*2,得到结果2 步骤2:将步骤1的结果再乘3,得到结果6 步骤3:将步骤1的结果再乘4,得到结果24 步骤4:将步骤1的结果再乘5,得到结果120 这样的算法虽然是正确的,但太繁琐,若求1000!,要算999次, 显然是不可取的。

6个变态的C语言HelloWorld程序介绍

6个变态的C语言HelloWorld程序介绍

6个变态的C语言HelloWorld程序介绍6个变态的C语言Hello World程序介绍对于初学者来说,第一个程序一般都是hello world,本文是店铺搜索整理的6个变态的'C语言Hello World程序介绍,有需要的小伙伴可以参考一下,希望对大家有所帮助!想了解更多相关信息请持续关注我们店铺!下面的六个程序片段主要完成这些事情:输出Hello, World混乱C语言的源代码下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C++的编译器g++才能编程通过。

hello1.c#define _________ }#define ________ putchar#define _______ main#define _(a) ________(a);#define ______ _______(){#define __ ______ _(0x48)_(0x65)_(0x6C)_(0x6C)#define ___ _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F)#define ____ _(0x72)_(0x6C)_(0x64)_(0x21)#define _____ __ ___ ____ _________#include<stdio.h>_____hello2.c#include<stdio.h>main(){int x=0,y[14],*z=&y;*(z++)=0x48;*(z++)=y[x++]+0x1D;*(z++)=y[x++]+0x07;*(z++)=y[x++]+0x00;*(z++)=y[x++]+ 0x03;*(z++)=y[x++]-0x43;*(z++)=y[x++]-0x0C;*(z++)=y[x++]+0x57;*(z++)=y[x++]-0x08;*(z++)=y[x++]+0x03;*(z++)=y[x++]-0x06;*(z++)=y[x++]-0x08;*(z++)=y[x++]-0x43;*(z++)=y[x]-0x21;x=*(--z);while(y[x]!=NULL)putchar(y[x++]);}hello3.c#include<stdio.h>#define __(a) goto a;#define ___(a) putchar(a);#define _(a,b) ___(a) __(b);main(){ _:__(t)a:_('r',g)b:_('$',p)c:_('l',f)d:_(' ',s)e:_('a',s)f:_('o',q)g:_('l',h)h:_('d',n)i:_('e',w)j:_('e',x)k:_('\n',z)l:_('H',l)m:_('X',i)n:_('!',k)o:_('z',q)p:_('q',b)q:_(',',d)r:_('i',l)s:_('w',v)t:_('H',j)u:_('a',a)v:_('o',a)w:_(')',k)x:_('l',c)y:_('\t',g)z:___(0x0)}hello4.cint n[]={0x48,0x65,0x6C,0x6C,0x6F,0x2C,0x20,0x77,0x6F,0x72,0x6C,0x64,0x21,0x0A,0x00},*m=n;main(n){putchar(*m)!='\0'?main(m++):exit(n++);}hello5.cmain(){int i,n[]={(((1<<1)<<(1<<1)<<(1<<1)<<(1<<(1>>1)))+((1<<1)<<(1<<1))), (((1<<1)<<(1<<1)<<(1<<1)<<(1<<1))-((1<<1)<<( 1<<1)<<(1<<1))+((1<<1)<<(1<<(1>>1)))+ (1 <<(1>>1))),(((1<<1)<<(1<<1)<<(1<<1)<< (1 <<1))-((1<<1)<<(1<<1)<<(1<<(1>>1)))- ((1<<1)<<(1<<(1>>1)))),(((1<<1)<<(1<<1)<<(1 <<1)<<(1<<1))-((1<<1)<<(1<<1)<<(1<<(1>>1 )))-((1<<1)<<(1<<(1>>1)))),(((1<<1)<< (1<<1)<<(1<<1)<<(1<<1))-((1<<1)<<(1<<1)<<( 1<<(1>>1)))-(1<<(1>>1))),(((1<<1)<<(1<<1)<<(1<<1))+((1<<1)<<(1<<1)<<(1<<(1>>1))) -((1<<1)<<(1<<(1>>1)))),((1<<1)<< (1<<1)<<(1<<1)),(((1<<1)<<(1<<1)<<(1<<1)<<(1<< 1))-((1<<1)<<(1<<1))-(1<<(1>>1))),(((1<<1)<<(1<<1)<<(1<<1)<<(1<<1))-((1<<1)<< (1 <<1)<<(1<<(1>>1)))-(1<<(1>>1))), (((1<<1)<<(1<<1)<<(1<<1)<<(1<<1))- ((1<<1)<< (1 <<1)<<(1<<(1>>1)))+(1<<1)), (((1<<1)<< (1<<1)<<(1<<1)<< (1<<1))-((1<<1)<< (1<<1) <<(1<<(1>>1)))-((1<<1) <<(1<< (1>>1)))), (((1<<1)<< (1<<1)<<(1<<1)<< (1<<1))- ((1<<1)<<(1<<1)<<(1<<1))+((1<<1)<< (1<<(1>> 1)))), (((1<<1)<<(1<<1) <<(1<<1))+(1<<(1 >>1))),(((1<<1)<<(1<<1))+((1<<1)<< (1<<( 1>>1))) + (1<< (1>>1)))}; for(i=(1>>1);i<(((1<<1) <<(1<<1))+((1 <<1)<< (1<<(1>>1))) + (1<<1)); i++) printf("%c",n[i]); }hello6.cpp下面的程序只能由C++的编译器编译(比如:g++)#include <stdio.h>#define _(_) putchar(_);int main(void){int i = 0;_(++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++i)_(++++++++++++++++++++++++++++++++++++++++++++++++++++++++++i)_(++++++++++++++i)_(--++i)_(++++++i)_(--------------------------------------------------------------------------------------------------------------------------------------i)_(------------------------i)_(++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++i)_(----------------i)_(++++++i)_(------------i)_(----------------i)_(--------------------------------------------------------------------------------------------------------------------------------------i)_(----------------------------------------------i)return i;}【6个变态的C语言Hello World程序介绍】。

各种语言的HelloWorld编程

各种语言的HelloWorld编程

各种语言的HelloWorld编程hello world百科名片C和C++“hello world”程序hello world作为所有编程语言的起始阶段,占据着无法改变的地位,所有中/英/法/德/美……版本的编程教材中,hello world总是作为第一个TEST记录于书本之中,所有的编程第一步就在于此了!经典之中的经典!hello world!目录简介 AKA 控制台: 传统图形界面应用开发工具: 基于web图形用户界面: 展开编辑本段简介这个例程是从Kernighan & Ritchie 合著的《The C Programme Language》开始有的,因为它的简洁,实用,并包含了一个程序所应具有的一切,因此为后来的些类书的作者提供了范例,一直待续到今。

我们刚开始接触计算机语言大多从Hello world 开始,下面是各种语言的Helloworld program:as400的RPGLE语言: D Vc_Hello s 100AC Eval Vc_Hello = 'Hello World!' C DSPLY Vc_Hello编辑本段AKA 控制台:ABC语言的Hello World程序WHILE (1=1) : WRITE \Ada语言的Hello World程序with Ada.Text_Io; use Ada.Text_Io; procedure Hello is beginPut_Line (\ end Hello;AmigaE语言的Hello World程序PROC main()WriteF('Hello, World!') ENDPROCAPL语言的Hello World程序'Hello World'Assembly语言的Hello World程序Accumulator-only architecture: DEC PDP-8, PAL-III assembler See the Example section of the PDP-8 article.Accumulator + index register machine: MOS 6502, CBM, ca65 asmMSG: .ASCIIZ \ LDX #0LDA MSG,X ; load initial char@LP: JSR $FFD2 ; CHROUT CBM KERNAL INXLDA MSG,X BNE @LP RTSAccumulator/Index microcoded machine: Data General Nova, RDOS See the example section of the Nova article.Expanded accumulator machine: Intel x86, MS-DOS, TASM MODEL SMALL IDEAL STACK 100HDATASEG语言的Hello World程序MSG DB 'Hello, world!$'CODESEG语言的Hello World程序MOV AX, @data MOV DS, AXMOV DX, OFFSET MSGMOV AH, 09H ; DOS: output ASCII$ string INT 21HMOV AX, 4C00H INT 21H ENDGeneral-purpose-register CISC: DEC PDP-11, RT-11, MACRO-11 .MCALL .REGDEF,.TTYOUT,.EXIT .REGDEFHELLO: MOV #MSG,R1 MOVB (R1),R0 LOOP: .TTYOUT MOVB +(R1),R0 BNE LOOP .EXITMSG: .ASCIZ /HELLO, WORLD!/ .END HELLOCISC: VAX, VMS, MACRO32 .title helloterm_name: .ascid /SYS$INPUT/ term_chan: .blkw 1 out_iosb: .blkq 1msg: .asciz /Hello, world!/ .entry start,0; establish a channel for terminal I/O $assign_s devnam=term_name,- chan=term_chan blbc r0,error; queue the I/O request $qio_s chan=term_chan,- func=#io$_writevblk,- iosb=out_iosb,- p1=msg,- p2=#13blbc r0,error $exit_s ; normal exit error: halt ; errorcondition .end startAWK语言的Hello World程序BEGIN { print \BASIC语言的Hello World程序PRINT \MS BASIC语言的Hello World程序(traditional, unstructured) 10 PRINT \ 20 ENDTI-BASIC语言的Hello World程序isp \Structured BASIC语言的Hello World程序print \BCPL语言的Hello World程序GET \ LET START () BE $(WRITES (\ $)BF语言的Hello World程序++++++++++[>+++++++>++++++++++>+++>+<<<++.>+.+++++++..+++.>++.<.+++.------.--------.>+.>.C语言的Hello World程序#include int main(void) {printf(\ }C++语言的Hello World程序#include using namespace std; int main() {cout << \ return 0; }C#语言的Hello World程序class HelloWorldApp {public static void Main() {System.Console.WriteLine(\ } }Clean语言的Hello World程序module hello Start :: String Start = \CLIST语言的Hello World程序PROC 0WRITE Hello, World!COBOL语言的Hello World程序IDENTIFICATION DIVISION. PROGRAM-ID. HELLO-WORLD. ENVIRONMENT DIVISION. DATA DIVISION. PROCEDURE DIVISION. DISPLAY \ STOP RUN.Common Lisp语言的Hello World程序(format t \感谢您的阅读,祝您生活愉快。

手把手教你用CBuilder实现硬件版helloworld编程控制电灯泡亮

手把手教你用CBuilder实现硬件版helloworld编程控制电灯泡亮之前,我们公布了一篇关于人工智能的知识应用实例——智能家居开源系统的二次开发的文章,引起了广大读者朋友们的强烈反响。

有不少朋友向我们索取了智能家居硬件二次开发的源程序代码参考学习。

有问到C语言、Delphi,java语言、Python语言、visual studio .NET开发环境等,几乎涵盖了好多种语言和软件开发工具。

作为程序员来讲,几乎上都比较擅长软件应用的开发,但对于硬件这块的知识几乎是空白,更谈不上软硬件如何相结合进行二次开发了。

为此,我们将编写推出一系列的硬件二次开发的Demo小例程,都是基于硬件的二次开发,基于物联网技术的应用。

我们将给广大爱好者或程序员朋友们,带来硬件版的或者说物联网版本的Hello World程序,给大家对硬件控制带来一个崭新的认识。

原来,实现智能硬件的控制,你也一样可以哦,并不难,非常简单。

C++Builder 10.2.3由于作者本人,最早期使用的是C++Builder和Delphi的软件开发工具,出于怀旧吧,我们今天第一个硬件版Hello World程序将使用C++Builder来进行编写,软件使用的是C++Builder 10.2.3 最新的版本。

当然,这个开发工具也同样适用于Delphi的开发,毕竟是一个祖宗嘛。

好了,废话不多说了,我们下面就开始进行工程的创建。

这个工程的功能,就是让我们可以通过鼠标点击按钮,实现打开灯泡和关闭灯泡的功能。

创建工程首先,我们使用File菜单下面的“VCL Forms Application- C++ Builder”来创建程序窗口。

创建窗体这样,一个Form设计器界面,就在我们面前了。

摆放控件然后,我们在Form窗体上,摆放4个Button按钮,以及一个ClientSocket控件。

我们PC电脑和硬件智能控制盒使用Socket的通信方式,进行接互,对于硬件控制盒的关键点介绍,我们后面会进行讲解。

简单的c语言程序代码

简单的c语言程序代码C语言是一种简单而强大的编程语言,广泛用于计算机科学和软件开发领域。

它的语法简洁明了,易于理解和学习。

在本文中,我们将介绍一些简单的C语言程序代码示例,以帮助初学者入门。

1. Hello, World!"Hello, World!"是编程中最简单的程序,它可以让我们在屏幕上输出一条简单的问候语。

以下是使用C语言编写的Hello World程序的示例代码:```c#include <stdio.h>int main() {printf("Hello, World!");return 0;}```在这个示例中,我们使用了`stdio.h`头文件,其中包含了输入输出函数的定义。

`printf`函数用于将文本输出到屏幕上。

`int main()`是程序的主函数,程序从这里开始执行。

`return 0;`语句表示程序执行成功。

2. 计算两个数的和这个示例程序可以计算两个数的和,并将结果打印到屏幕上。

以下是示例代码:```c#include <stdio.h>int main() {int num1, num2, sum;printf("请输入两个整数:");scanf("%d%d", &num1, &num2);sum = num1 + num2;printf("两个数的和是:%d", sum);return 0;}```在这个程序中,我们首先声明了三个整型变量`num1`、`num2`和`sum`。

`printf`函数用于显示提示信息,要求用户输入两个整数。

然后,使用`scanf`函数将用户输入的值存储在`num1`和`num2`中。

接下来,我们计算两个数的和,将结果存储在`sum`中,并使用`printf`函数将结果显示在屏幕上。

3. 判断一个数是否为正数下面是一个简单的程序示例,可以判断用户输入的数是否为正数。

stm32三自由度机器人c语言程序代码

stm32三自由度机器人c语言程序代码main.c/******************************************************************************** * @file GPIO/IOToggle/main.c* @author MCD Application Team* @version V3.5.0* @date 08-April-2011* @brief Main program body.****************************************************************************** * @attention******************************************************************************* *//* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h"#include <stdio.h>#include "main.h"#include "delay.h"#include "DMA.h"#include "TIMx.h"#include "GPIOx.h"#include "NVIC.h"#include "USARTx.h"/* 宏定义 ------------------------------------------------------------------*/ #define uchar unsigned char#define uint unsigned int#define Motor1_SUB 16 //电机1 16细分#define Motor2_SUB 16 //电机2 16细分#define Motor3_SUB 16 //电机3 16细分#define Motor1_DIR PAout( 4 ) //电机1 方向#define Motor2_DIR PAout( 5 ) //电机2 方向#define Motor3_DIR PAout( 7 ) //电机3 方向#define Motor1_UP Motor1_DIR = 1 //电机1 上升#define Motor2_UP Motor2_DIR = 1 //电机2 上升#define Motor3_UP Motor3_DIR = 1 //电机3 上升#define Motor1_DOWN Motor1_DIR = 0 //电机1 下降#define Motor2_DOWN Motor2_DIR = 0 //电机2 下降#define Motor3_DOWN Motor3_DIR = 0 //电机3 下降/* 变量定义 ------------------------------------------------------------------*/ u8 Delay_1s_Finishflag = 0;u8 KeyTrg = 0; //按键触发u8 KeyCont = 0; //按键长按uint i;u16 EXIT0_CNT = 0;u8 Motor1_OriginFlag = 0; //电机1 原点标识u8 Motor2_OriginFlag = 0; //电机1 原点标识u8 Motor3_OriginFlag = 0; //电机1 原点标识u8 Motor_Arrived = 0; //电机到达标识/* 函数声明 ------------------------------------------------------------------*/ void RTC_configuration( void );void RCC_Configuration( void );void KeyRead( void );void Delay_Ms( u16 time );void delay_1s( uint time );//================================== MAIN=======================================int main( void )u16 i = 0;BUZZER = 0;//蜂鸣器复位GPIOE -> ODR &= 0xffff0000; //LED1 ~ LED8 = 0;RCC_Configuration();// RTC_configuration();GPIO_Configuration();NVIC_Configuration();EXTI_Configuration();Motor_Init( 0 0 0 );//TIM1关闭状态不会触发TIM2//屏蔽所有外部中断EXTI -> IMR = 0;if( LS1 ){TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable );Motor1_OriginFlag = 1;}if( LS2 ){TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable );Motor2_OriginFlag = 1;}if( LS3 ){TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable );Motor3_OriginFlag = 1;}Delay_Ms( 1000 );//开启所有外部中断EXTI -> IMR = 0x07;while( !Motor1_OriginFlag | !Motor2_OriginFlag | !Motor3_OriginFlag ){TIM1_TIM2_PWM( 1000 3200 );//让没有回到原位的导轨滑块回到原位用于初始状态的调平基准}//屏蔽所有外部中断EXTI -> IMR = 0;TIM_Cmd( TIM1 DISABLE );//关闭TIM1TIM1 -> CNT = 0;//定时器1 当前计数值清零TIM2 -> CNT = 0;//定时器2 当前计数值清零Delay_Ms( 1000 );Motor1_UP;//电机1 上升Motor2_UP;//电机2 上升Motor3_UP;//电机3 上升TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Enable );//使能 TIM2 -> CH1通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Enable );//使能 TIM2 -> CH2通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Enable );//使能 TIM2 -> CH3通道PWM输出TIM_ITConfig( TIM1 TIM_IT_Update ENABLE ); //开启TIM1中断Motor_Arrived = 0;TIM1_TIM2_PWM( 1000 1600 );while( !Motor_Arrived );Motor_Arrived = 0;TIM1_TIM2_PWM( 700 3200 );while( !Motor_Arrived );Motor1_DOWN;//电机1 下降Motor2_DOWN;//电机2 下降Motor3_DOWN;//电机3 下降Motor_Arrived = 0;TIM1_TIM2_PWM( 500 1600 );while( !Motor_Arrived );//==================================== F1=========================================TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable ); //关闭 TIM2 -> CH1通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Enable ); //使能 TIM2 -> CH2通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable ); //关闭 TIM2 -> CH3通道PWM输出Motor_Arrived = 0;Motor2_UP;//电机2 上升TIM1_TIM2_PWM( 1500 500 );//2#电机上升while( !Motor_Arrived );delay_ms( 2000 );TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Enable ); //使能 TIM2 -> CH1通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable ); //关闭 TIM2 -> CH2通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable ); //关闭 TIM2 -> CH3通道PWM输出Motor_Arrived = 0;Motor1_UP;//电机1 上升TIM1_TIM2_PWM( 1500 1500 );//1#电机上升while( !Motor_Arrived );delay_ms( 3000 );//==================================== F2=========================================TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable ); //关闭 TIM2 -> CH1通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Enable ); //使能 TIM2 -> CH2通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable ); //关闭 TIM2 -> CH3通道PWM输出Motor_Arrived = 0;Motor2_DOWN;//电机2 下降TIM1_TIM2_PWM( 1500 2000 );//2#电机下降while( !Motor_Arrived );delay_ms( 3000 );TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable ); //关闭 TIM2 -> CH1通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable ); //关闭 TIM2 -> CH2通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Enable ); //使能 TIM2 -> CH3通道PWM输出Motor_Arrived = 0;Motor3_UP;//电机3 上升TIM1_TIM2_PWM( 1500 1500 );//3#电机上升while( !Motor_Arrived );delay_ms( 3000 );TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Enable ); //使能 TIM2 -> CH1通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable ); //关闭 TIM2 -> CH2通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable ); //关闭 TIM2 -> CH3通道PWM输出Motor_Arrived = 0;Motor1_DOWN;//电机1 下降TIM1_TIM2_PWM( 1500 2500 );//1#电机下降while( !Motor_Arrived );delay_ms( 3000 );//=================================== F3=========================================TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable ); //关闭 TIM2 -> CH1通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Enable ); //使能 TIM2 -> CH2通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable ); //关闭 TIM2 -> CH3通道PWM输出Motor_Arrived = 0;Motor2_UP;//电机2 上升TIM1_TIM2_PWM( 1500 3000 );//2#电机上升while( !Motor_Arrived );delay_ms( 2000 );//==================================== F4=========================================TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Enable ); //使能 TIM2 -> CH1通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable ); //关闭 TIM2 -> CH2通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable ); //关闭 TIM2 -> CH3通道PWM输出Motor_Arrived = 0;Motor1_UP;//电机1 上升TIM1_TIM2_PWM( 1500 2500 );//1#电机上升while( !Motor_Arrived );delay_ms( 3000 );//==================================== F5=========================================TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable ); //关闭 TIM2 -> CH1通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable ); //关闭 TIM2 -> CH2通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Enable ); //使能 TIM2 -> CH3通道PWM输出Motor_Arrived = 0;Motor3_UP;//电机3 上升TIM1_TIM2_PWM( 1500 2500 );//3#电机上升while( !Motor_Arrived );delay_ms( 3000 );//==================================== F6=========================================TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable ); //关闭 TIM2 -> CH1通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Enable ); //使能 TIM2 -> CH2通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable ); //关闭 TIM2 -> CH3通道PWM输出Motor_Arrived = 0;Motor2_UP;//电机2 上升TIM1_TIM2_PWM( 1500 3000 );//2#电机上升while( !Motor_Arrived );delay_ms( 2000 );//================================ F7 回原位======================================TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Enable ); //使能 TIM2 -> CH1通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable ); //关闭 TIM2 -> CH2通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable ); //关闭 TIM2 -> CH3通道PWM输出Motor_Arrived = 0;TIM1_TIM2_PWM( 1500 3000 );//1#电机上升while( !Motor_Arrived );TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable ); //关闭 TIM2 -> CH1通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable ); //关闭 TIM2 -> CH2通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Enable ); //使能 TIM2 -> CH3通道PWM输出Motor_Arrived = 0;Motor3_UP;//电机3 上升TIM1_TIM2_PWM( 1500 500 );//3#电机上升while( !Motor_Arrived );delay_ms( 2000 );for( i = 0; i < 5; ++i ){BUZZER = !BUZZER;delay_ms( 200 );}BUZZER = 0;//蜂鸣器复位while ( 1 ){LED2 = 1;LED3 = 1;LED1 = 1;delay_ms( 1000 );LED1 = 0;delay_ms( 1000 );}}//==========================子程序入口=================================/*** @brief 时钟配置* @param None* @retval None*///外部晶振为8M PLLCLK=SYSCLK=72M HCLK=72M P2CLK=72M P1CLK=36M ADCCLK=36M USBCLK=48M TIMCLK=72Mvoid RCC_Configuration( void ){ErrorStatus HSEStartUpStatus; //定义错误状态枚举变量ERROR SUCCESSRCC_DeInit(); //RCC寄存器重新设置为默认值RCC_HSEConfig( RCC_HSE_ON ); //打开外部高速时钟晶振HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待外部高速时钟工作if(HSEStartUpStatus == SUCCESS){RCC_HCLKConfig( RCC_SYSCLK_Div1 ); //设置AHB不分频 HCLK = SYSCLKRCC_PCLK2Config( RCC_HCLK_Div1 ); //设置APB2不分频 P2CLK = HCLKRCC_PCLK1Config( RCC_HCLK_Div2 ); //设置APB1为2分频P1CLK = HCLK / 2FLASH_SetLatency( FLASH_Latency_2 ); //设置FLASH代码延时FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable ); //设置预取指缓存RCC_PLLConfig( RCC_PLLSource_HSE_Div1 RCC_PLLMul_9 ); //设置PLL时钟外部时钟不分频为HSE的9倍频8MhZ * 9 = 72MHZRCC_PLLCmd(ENABLE); //使能PLLwhile(RCC_GetFlagStatus( RCC_FLAG_PLLRDY) == RESET ); //等待PLL准备就绪 RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK ); //设置PLL为系统时钟源while( RCC_GetSYSCLKSource() != 0x08 ); //判断PLL是否为系统时钟源}}/*** @brief RTC实时时钟配置* @param None* @retval None*/void RTC_configuration( void ){RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWRENABLE);PWR_BackupAccessCmd(ENABLE);BKP_DeInit();RCC_LSEConfig(RCC_LSE_ON);while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET);RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);RCC_RTCCLKCmd(ENABLE);RTC_WaitForSynchro();RTC_WaitForLastTask();RTC_WaitForLastTask();RTC_SetPrescaler( 32767 );RTC_WaitForLastTask();PWR_BackupAccessCmd(DISABLE);}/*** @brief STM32主板按键查询函数* @param None* @retval None*/void KeyRead( void ){u8 ReadKey_Data; //读取按键输入数据ReadKey_Data = GPIOC -> IDR ^ 0x0f;KeyTrg = ReadKey_Data & ( ReadKey_Data ^ KeyCont ); KeyCont = ReadKey_Data;}/*** @brief 软件延时函数* @param None* @retval None*/void Delay_Ms( u16 time ) //延时1ms函数{u16 ij;for( i = 0; i < time; i++ )for( j = 10000; j > 0; j-- );}/*** @brief TIM4 精确延时* @param None* @retval None*/void delay_1s( uint time ) //延时1s函数uint i;for( i = 0; i < time; i++ ){TIM_Cmd( TIM4 ENABLE ); //开启定时器TIM4while( !Delay_1s_Finishflag );Delay_1s_Finishflag = 0;}}/******************************************************************************** * @file GPIO/IOToggle/stm32f10x_it.c* @author MCD Application Team* @version V3.5.0* @date 08-April-2011* @brief Main Interrupt Service Routines.* This file provides template for all exceptions handler and peripherals* interrupt service routine.****************************************************************************** * @attention** THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY* DIRECT INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.** <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>****************************************************************************** *//* Includes ------------------------------------------------------------------*/ #include "stm32f10x_it.h"#include "main.h"#include "dma.h"#include "GPIOx.h"/* 宏定义 -------------------------------------------------------------------*///=================================MAIN中定义====================================extern u16 EXIT0_CNT;extern u8 Motor1_OriginFlag; //电机1 原点标识extern u8 Motor2_OriginFlag; //电机1 原点标识extern u8 Motor3_OriginFlag; //电机1 原点标识extern u8 Motor_Arrived; //电机到达标识// -------------------------------- SENSOR USE--------------------------------- extern u8 Delay_1s_Finishflag;extern void Delay_Ms( u16 time );//=================================MAIN中定义====================================//****************************************************************************** */** @addtogroup STM32F10x_StdPeriph_Examples* @{*//** @addtogroup GPIO_IOToggle* @{*//* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*//******************************************************************************/ /* Cortex-M3 Processor Exceptions Handlers */ /******************************************************************************//*** @brief This function handles NMI exception.* @param None* @retval None*/void NMI_Handler(void){}/*** @brief This function handles Hard Fault exception.* @param None* @retval None*/void HardFault_Handler(void){/* Go to infinite loop when Hard Fault exception occurs */while (1){}}/*** @brief This function handles Memory Manage exception.* @param None* @retval None*/void MemManage_Handler(void){/* Go to infinite loop when Memory Manage exception occurs */ while (1){}}/*** @brief This function handles Bus Fault exception.* @param None* @retval None*/void BusFault_Handler(void){/* Go to infinite loop when Bus Fault exception occurs */ while (1){}}/*** @brief This function handles Usage Fault exception.* @param None* @retval None*/void UsageFault_Handler(void){/* Go to infinite loop when Usage Fault exception occurs */ while (1){}}/*** @brief This function handles SVCall exception.* @param None* @retval None*/void SVC_Handler(void){}/*** @brief This function handles Debug Monitor exception.* @param None* @retval None*/void DebugMon_Handler(void){}/*** @brief This function handles PendSV_Handler exception.* @param None* @retval None*/void PendSV_Handler(void){}/*** @brief This function handles SysTick Handler.* @param None* @retval None*/void SysTick_Handler(void){}/*** @brief This function handles TIM4 global interrupt request.* @param None* @retval None*/void TIM4_IRQHandler( void ){if( TIM_GetITStatus( TIM4 TIM_IT_Update ) != RESET ){TIM_Cmd( TIM4 DISABLE ); //关闭定时器TIM4TIM_ClearITPendingBit( TIM4 TIM_FLAG_Update ); //清除TIM4中断待处理位 Delay_1s_Finishflag = 1; //延时1s完成标志}}/************************************************************ 函数名:TIM3_IRQHandler** 功能描述:TIM3中断服务程序** 输入参数: 无** 输出参数: 无***********************************************************/void TIM3_IRQHandler( void )}/*** @brief This function handles TIM2 global interrupt request.* @param None* @retval None*/void TIM2_IRQHandler( void ){}/*** @brief This function handles TIM4 global interrupt request.* @param None* @retval None*/void TIM1_UP_IRQHandler( void ){if( TIM_GetITStatus( TIM1 TIM_IT_Update ) != RESET ){TIM_ClearITPendingBit( TIM1 TIM_IT_Update ); //清除TIM1中断待处理位 TIM_Cmd( TIM1 DISABLE ); //关闭定时器TIM1Motor_Arrived = 1; //电机定位完成LED8 = !LED8;}}/*** @brief This function handles USART3 global interrupt request.* @param None* @retval None*/void USART1_IRQHandler( void ){GPIO_SetBits( GPIOC GPIO_Pin_4 );Delay_Ms( 1000 );USART_ClearFlag( USART1 USART_FLAG_RXNE );USART_ClearITPendingBit( USART1 USART_FLAG_RXNE );/*** @brief DMA1 -> CH7 USART2发送数据完成DMA中断入口* @param None* @retval None*/void DMA1_Channel7_IRQHandler( void ){LED2 = 1;if( DMA_GetFlagStatus( DMA1_FLAG_TC7 ) != RESET ){LumMod_Uart_DAM_Tx_Over();}}/*** @brief This function handles USART3 global interrupt request.* @param None* @retval None*/void USART3_IRQHandler( void ){}/*** @brief DMA1 -> CH6 USART2接收数据完成DMA中断入口* @param None* @retval None*/void USART2_IRQHandler( void ){LED3 = 1;if( USART_GetITStatus( USART2 USART_IT_IDLE ) != RESET ) // 空闲中断 {LumMod_Uart_DMA_Rx_Data();USART_ReceiveData( USART2 ); // Clear IDLE interrupt flag bit}}* @brief This function handles EXTI0 global interrupt request. * @param None* @retval None*/void EXTI0_IRQHandler( void ){if( EXTI_GetITStatus( EXTI_Line0 ) != RESET ){delay_ms( 10 );//延时防止抖动if( LS1 == 1 ){LED5 = !LED5;}while( !LS1 );TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable );Motor1_OriginFlag = 1;//电机1 到达原点EXTI_ClearITPendingBit( EXTI_Line0 );EXTI -> IMR = 0x06;//关闭外部中断0}}/*** @brief This function handles EXTI1 global interrupt request. * @param None* @retval None*/void EXTI1_IRQHandler( void ){if( EXTI_GetITStatus( EXTI_Line1 ) != RESET ){delay_ms( 10 );//延时防止抖动if( LS2 == 1 ){LED6 = !LED6;}while( !LS2 );TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable );Motor2_OriginFlag = 1;//电机2 到达原点EXTI_ClearITPendingBit( EXTI_Line1 );EXTI -> IMR = 0x05;//关闭外部中断1}}/*** @brief This function handles EXTI2 global interrupt request.* @param None* @retval None*/void EXTI2_IRQHandler( void ){if( EXTI_GetITStatus( EXTI_Line2 ) != RESET ){delay_ms( 10 );//延时防止抖动if( LS3 == 1 ){LED7 = !LED7;}while( !LS3 );TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable );Motor3_OriginFlag = 1;//电机3 到达原点EXTI_ClearITPendingBit( EXTI_Line2 );EXTI -> IMR = 0x03;//关闭外部中断2}}/******************************************************************************/ /* STM32F10x Peripherals Interrupt Handlers */ /* Add here the Interrupt Handler for the used peripheral(s) (PPP) for the */ /* available peripheral interrupt handler's name please refer to the startup */ /* file (startup_stm32f10x_xx.s). */ /******************************************************************************//*** @brief This function handles PPP interrupt request.* @param None* @retval None*//*void PPP_IRQHandler(void){}*//*** @}*//*** @}*//******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****//******************************************************************************** * @file 传感器模块测试程序/LCD12864/LCD12864_main.c* @author dotod* @version V1.0* @date 10-DEC-2017* @brief Main program body.****************************************************************************** * @attention printf() 输出打印函数******************************************************************************* */#include "printf.h"/******************************************************************************* * Function Name : fputc* Descxxxxription : 重定向printf() 函数* Input :* Output : None* Return : None*******************************************************************************/int fputc( int ch FILE *f ){USART2 -> SR; //USART_GetFlagStatus( USART1 USART_FLAG_TC ) 解决第一个字符发送失败的问题USART_SendData( USART2 ( unsigned char ) ch ); //顺序发送字符while( USART_GetFlagStatus( USART2 USART_FLAG_TC )!= SET ); //等待发送完成return( ch );}/******************************************************************************* * Function Name : fgetc* Descxxxxription : 重定向scanf() 函数* Input :* Output : None* Return : None*******************************************************************************/ int fgetc( FILE *f ){while ( USART_GetFlagStatus( USART3 USART_FLAG_RXNE ) == RESET ); //等待串口1输入数据return (int)USART_ReceiveData( USART3 );}/******************************************************************************** * @file 传感器模块测试程序/delay();* @author dotod* @version V1.0* @date 10-DEC-2017* @brief Main program body.****************************************************************************** * @attention* SYSTICK 非中断方式实现精确延时 SYSTICK时钟固定为HCLK的时钟1/8* 选用内部时钟源72M 所以SYSTICK的时钟为9M 即SYSTICK定时器以9M的频率递减* SysTick 主要包括CTRL LOAD VAL CALIB 4个寄存器*********************************************************************************//* Includes ------------------------------------------------------------------*/ #include "delay.h"/*** @brief 实现us精确延时* @param None* @retval None*/void delay_us( u32 nus ){u32 temp;SysTick -> LOAD = 9 * nus;SysTick -> VAL = 0X00;//清空计数器SysTick -> CTRL = 0X01;//使能减到零是无动作采用外部时钟源do{temp = SysTick -> CTRL;//读取当前倒计数值}while( ( temp & 0x01 ) && ( ! ( temp & ( 1 << 16 ) ) ) );//等待时间到达SysTick -> CTRL = 0x00; //关闭计数器SysTick -> VAL = 0X00; //清空计数器}/*** @brief 实现ms精确延时* @param None* @retval None*/void delay_ms( u16 nms ){u32 temp;SysTick -> LOAD = 9000 * nms;SysTick -> VAL = 0X00;//清空计数器SysTick -> CTRL = 0X01;//使能减到零是无动作采用外部时钟源do{temp=SysTick -> CTRL;////读取当前倒计数值}while( ( temp & 0x01 ) && ( !( temp & ( 1 << 16 ) ) ) );//等待时间到达SysTick -> CTRL = 0x00; //关闭计数器SysTick -> VAL = 0X00; //清空计数器}/********************************************************************************* @file 传感器模块测试程序* @author dotod* @version V1.0* @date 10-DEC-2017* @brief******************************************************************************* @attention********************************************************************************//* Includes ------------------------------------------------------------------*/ #include "DMA.h"#include <stdio.h>#include <string.h>/* 变量定义 ------------------------------------------------------------------*/u8 LumMod_Tx_Buf[ 20 ];u8 LumMod_Rx_Buf[ 20 ];uint LumMod_Rx_Data_index = 0;uint LUMMOD_TX_BSIZE = 0;uint LUMMOD_RX_BSIZE = 0;/*** @brief USART_DMA_Init USART1 DMA通道配置* @param None* @retval None*/void USART_DMA_Init( void ){DMA_InitTypeDef DMA_InitStructure;/* DMA1 clock enable */RCC_AHBPeriphClockCmd( RCC_AHBPeriph_DMA1 ENABLE ); //开启DMA1时钟/*--- LUMMOD_UART_Tx_DMA_Channel DMA Config ---*/DMA_Cmd( DMA1_Channel7 DISABLE ); // 关闭DMA通道7DMA_DeInit( DMA1_Channel7 ); // 恢复DMA通道配置缺省值DMA_InitStructure.DMA_PeripheralbaxxxxseAddr = ( uint32_t )( &USART2 -> DR ); // 设置串口发送数据寄存器地址DMA_InitStructure.DMA_MemorybaxxxxseAddr = ( uint32_t )LumMod_Tx_Buf; // 设置发送数据缓冲区首地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;// 设置数据传输方向双向传输内存缓冲区 -> 外设寄存器DMA_InitStructure.DMA_BufferSize = LUMMOD_TX_BSIZE;// 需要发送的字节数这里可以设置为0 实际要发送数据时会重新设置次值DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;// 设置外设递增模式因为该通道只连接一个外设所以不需要递增DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;// 设置DMA内存缓冲区地址递增模式DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;// 外设数据宽度为8位 1个字节DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;// 内存数据宽度为8位 1个字节DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 设置DMA传输方式单次传输模式DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;// 优先级设为很高DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;// 关闭内存到内存的DMA方式DMA_Init( DMA1_Channel7 &DMA_InitStructure ); // DMA通道初始化DMA_ClearFlag( DMA1_FLAG_GL7 ); // 清除DMA所有标志DMA_Cmd( DMA1_Channel7 DISABLE ); // 失能DMADMA_ITConfig( DMA1_Channel7 DMA_IT_TC ENABLE ); // 开启发送DMA中断/*--- LUMMOD_UART_Rx_DMA_Channel DMA Config ---*/DMA_Cmd( DMA1_Channel6 DISABLE ); // 关闭DMA通道6DMA_DeInit( DMA1_Channel6 ); // 恢复DMA通道配置缺省值DMA_InitStructure.DMA_PeripheralbaxxxxseAddr = LUMMOD_UART_DR_baxxxxse; // 设置串口接收数据寄存器地址DMA_InitStructure.DMA_MemorybaxxxxseAddr = ( uint32_t )LumMod_Rx_Buf; // 设置接收数据缓冲区首地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;// 设置数据传输方向双向传输外设寄存器 -> 内存缓冲区DMA_InitStructure.DMA_BufferSize = LUMMOD_RX_BSIZE;// 设置最大接收字节数DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;// 设置外设递增模式因为该通道只连接一个外设所以不需要递增DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;// 设置DMA内存缓冲区地址递增模式DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;// 外设数据宽度为8位 1个字节DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;// 内存数据宽度为8位 1个字节DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 设置DMA传输方式单次传输模式DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;// 优先级设为很高DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;// 关闭内存到内存的DMA方式DMA_Init( DMA1_Channel6 &DMA_InitStructure ); // DMA通道初始化DMA_ClearFlag( DMA1_FLAG_GL6 ); // 清除DMA所有标志DMA_Cmd( DMA1_Channel6 ENABLE ); // 开启DAM接收通道等待接收数据}/*** @brief DMA1 -> CH7 USART2发送数据完成DMA中断处理* @param None* @retval None*/void LumMod_Uart_DAM_Tx_Over( void ){DMA_ClearFlag( DMA1_FLAG_GL7 ); // 清除标志位DMA_Cmd( DMA1_Channel7 DISABLE ); // 关闭DMA通道DMA1_Channel7 -> CNDTR = 0; // 清除数据长度// OSMboxPost( mbLumModule_Tx ( void * ) 1 ); // 设置标志位}/*** @brief USART2要发送数据处理* @param None* @retval None*/u16 LumMod_Cmd_WriteParam( u16 sample_num u8 *psz_param ){// uint err;uint LumMod_Tx_Index ;if( !sample_num ) //判断数据长度是否有效return 0;while ( DMA_GetCurrDataCounter( DMA1_Channel7 ) );//检查DMA通道内是否还有数据 if( psz_param )memcpy( LumMod_Tx_Buf psz_param ( sample_num > 1024 ? 1024 :sample_num ) );LumMod_Tx_Index = 0;LumMod_Tx_Buf[ LumMod_Tx_Index++ ] = 1;LumMod_Tx_Buf[ LumMod_Tx_Index++ ] = 2;LumMod_Tx_Buf[ LumMod_Tx_Index++ ] = 3;LumMod_Tx_Buf[ LumMod_Tx_Index++ ] = 4;LumMod_Tx_Buf[ LumMod_Tx_Index++ ] = 5;LumMod_Tx_Buf[ LumMod_Tx_Index++ ] = 6;LumMod_Tx_Buf[ LumMod_Tx_Index++ ] = 7;LumMod_Tx_Buf[ LumMod_Tx_Index++ ] = 8;LumMod_Uart_Start_DMA_Tx( LumMod_Tx_Index );// OSMboxPend( mbLumModule_Tx 0 &err );return sample_num;}/*** @brief USART1要发送数据字节数目高速DMA并开启DMA传输* @param None* @retval None*/void LumMod_Uart_Start_DMA_Tx ( uint16_t size ){DMA1_Channel7 -> CNDTR = ( uint16_t )size; // 设置要发送的字节数目DMA_Cmd( DMA1_Channel7 ENABLE ); // 开启DMA发送}/*** @brief DMA1 -> CH3 USART1接收数据完成DMA中断入口* @param None* @retval None*/void LumMod_Uart_DMA_Rx_Data( void ){DMA_Cmd( LUMMOD_UART_Rx_DMA_Channel DISABLE ); // 关闭DMA防止干扰DMA_ClearFlag( LUMMOD_UART_Rx_DMA_FLAG ); // 清除DNA标志位LumMod_Rx_Data_index = LUMMOD_RX_BSIZE -DMA_GetCurrDataCounter( DMA1_Channel3 ); //获得接收的字节数LUMMOD_UART_Rx_DMA_Channel -> CNDTR = LUMMOD_RX_BSIZE; // 重新设置计数值必须大于等于可能接收到的数据帧数目DMA_Cmd( LUMMOD_UART_Rx_DMA_Channel ENABLE ); //DMA开启等待数据接收/***如果中断发送数据帧的速率很快 MCu来不及处理此次中断接收的数据中断又发来新的数据这里不能开启否则数据会被覆盖*有一下两种解决方法*1 - 重新开启DMA接收数据之前将LumMod_Rx_Buf缓冲区的数据复制到另一个数组中再开启DMA 然后马上处理数组中的数据*2 - 建立双缓冲在LumMod_Uart_DMA_Rx_Data()函数中重新配置DMA_MemorybaxxxxseAddr的缓冲区地址那么下次接收到的数据* 会被保存到新的缓冲区不会被覆盖*/// OSMboxPost( mbLumModule_Rx LumMod_Rx_Buf ); //}/******************************************************************************** * @file 传感器模块测试程序* @author dotod。

STM32入门简易教程

STM32入门简易教程首先,我们需要一块STM32开发板。

ST公司有多种型号可供选择,其中比较常用的是STM32F4系列和STM32F7系列。

这些开发板通常配有USB接口和一些基本的外设,如LED、按钮和串口通信。

安装完开发环境后,我们就可以开始编写代码了。

首先,我们需要创建一个新的工程。

在STM32CubeIDE中,我们可以选择创建一个基于单片机型号的模板工程。

然后,我们可以命名工程,并选择要使用的板级支持软件包。

一旦工程创建完成,我们就可以添加源文件并开始编写代码了。

在STM32CubeIDE中,我们可以使用C语言或C++语言来编写代码。

我们可以使用标准的C库或者ST提供的HAL库来操作单片机的外设。

在编写代码之前,我们需要了解一些基本概念。

每个STM32单片机都有一些寄存器,用于控制和配置外设。

我们可以使用这些寄存器来读取和写入寄存器的值,以控制外设的行为。

一般来说,我们需要完成以下几个步骤来编写STM32的代码:1.配置时钟:STM32单片机有多个时钟源和时钟分频器,我们需要配置它们以满足我们的需求。

2.配置外设:根据我们的需求,我们需要配置STM32的外设,如GPIO、USART、SPI等。

我们可以使用寄存器来配置和控制外设。

3.编写主程序:我们可以编写一个循环主程序,在其中处理一些任务。

这可能包括读取和写入外设、处理中断等。

以上就是一个简单的STM32入门教程。

当然,STM32的功能非常丰富,这只是一个入门的起点。

如果想深入学习STM32,我们可以继续学习更多的外设和高级特性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档