串口接收进入中断+串口接收不进入中断 串口接收进入中断:串口数据寄存器接收到数据,会置一个接收数据寄存器非空标志位,如果使能了中断会进入中断,在中断函数里读取数据寄存器,状态标志位自动清0,在中断函数中读取数据寄存器可以防止程序打扰串口数据寄存器的读取。串口接收不进入中断:串口接收数据,不进入中断也可以接收数据,但缺点是读取数据寄存器不及时,下一次接收的数据会把上一次接收的数据覆盖,出现漏读现象导致错误。...
STM32中事件标志位与中断标志位 若在此时使能中断将产生中断,其实中断标志已经被置1(产生事件的时候)当一个事件发生时,事件标志位由硬件置1,此时无论是否使能中断。可见:更新事件与更新中断共用一个标志位。事件标志位:FlagStatus。中断标志位:ITStatus。...
STM32定时器(计数器计数周期) 因为计数器是从0开始计数到ARR,计数为0时计算一次,例:ARR=3,计算器计数4次(0,1,2,3)计数器时钟:CK_CNT=CK_PSC/(PSC+1)计数器计数一次的时间:t=1/CK_CNT。计数器计数周期:T=t*(ARR+1)内部时钟:CK_INT(72MHz)预分频器实际分频系数:PSC+1。为什么是ARR+1?...
函数的递归求n的阶乘以及各种规律问题 #include<stdio.h>int fac(int n);int main(){int m;m=0;printf("请输入m的值");scanf("%d",&m);printf("%d",fac(m));return 0;}int fac(int n){if(n<1) return -1;else if(n==1) return 1;else return n*fac(n-1);}
编辑一个方阵,找出方阵每列中最小元素及所在的行号(遇到了超过二维数组的定义范围的问题) #include<stdio.h>#define M 5void findmin(int (*s)[M],int *c){int i;int j;int t;for(j=0;j<M;j++){ t=0; for(i=1;i<M;i++){if(s[i][j]<s[t][j]){ //上面若令i=0,s[i+1][j]就会出现s[5][j]的情况,超出了数组的定义范围 t=i; } c[j]=t; }}}void outdata(i.
编辑一个方阵,找出方阵每列中最小元素及所在的行号(遇到了超过二维数组的定义范围的问题) #include<stdio.h>#define M 5void findmin(int (*s)[M],int *c){int i;int j;int t;for(j=0;j<M;j++){ t=0; for(i=1;i<M;i++){if(s[i][j]<s[t][j]){ //上面若令i=0,s[i+1][j]就会出现s[5][j]的情况,超出了数组的定义范围 t=i; } c[j]=t; }}}void outdata(i.
指针变量指向一个数组的首地址 #include<stdio.h>int main(){int arr[3]={1,2,3};int *p;p=&arr[0];//数组首个元素的地址就是数组的首地址p=arr;//数组名就是数组的首地址printf("首元素是:%d",*p);return 0;}D:\>gcc jianzhi.cD:\>a.exe首元素是:1D:\>...
输入三个数a,b,c,要求不管怎么输入,在输出的时候,a,b,c,由从大到小的顺序输出,用函数封装实现 #include<stdio.h>void chagedata(int *a,int *b,int *c){int max;if(*a<=*b){max=*b;*b=*a;*a=max;}if(*a<=*c){max=*c;*c=*a;*a=max; }if(*b<=*c){max=*c;*c=*b;*b=max;}}int main(){int a;int b;int c;puts("请输入三个数");scanf(".
为什么要用指针(2)指针指向固定的区域 #include<stdio.h>int main(){//随便找一个地址,例如:0x000000000061FE33int *p;p=(int *)0x000000000061FE33;printf("p=0x%p",p);return 0;}D:\>gcc dizhi.cD:\>a.exep=0x000000000061FE33D:\>
为什么要用指针(一) #include<stdio.h>/*void chagedata(int data,int data2){int tamp;tamp=data;data=data2;data2=tamp;}int main(){int data;int data2;data=10;data2=20;printf("why point");printf("交换前:data=%d,data2=%d",data,data2);chagedata(data,data2);p.
指针要求类型的原因 #include<stdio.h>int main(){int a;a=0x1234;int *p;char *c;p=&a;c=&a;//存储的地址相同printf("p=%p",p);printf("c=%p",c);//地址指向的存储单元的空间大小不同printf("a=%x",*p);printf("a=%x",*c);//地址增量也不同printf("++p=%p",++p);printf("++c=%p".
通过指针变量访问存储单元中的数据 #include<stdio.h>int main(){int a;int *p;a=10;p=&a;printf("a=%d",*p);return 0;}D:\>gcc zhizheng.cD:\>a.exea=10D:\>
通过变量名访问存储单元中的数据以及通过地址访问存储单元中的数据 #include<stdio.h>int main(){int a;a=10;printf("a=%d",a);printf("a的地址是:0x%p",&a);printf("a=%d",*(&a));//*是间接运算符,作用是求取地址所指向的存储单元中的值return 0;}D:\>gcc zhi.cD:\>a.exea=10a的地址是:0x000000000061FE1Ca=10...
数组元素作为函数调用的实参 #include<stdio.h>int PrintData(int data){printf("%d",data);}int main(){int arry[3]={0,1,2};PrintData(arry[2]);return 0;}D:\>gcc printdata.cD:\>a.exe2D:\>
编写程序,打印以下图形(利用了循环的嵌套) #include<stdio.h>int main(){int i,j,k;for(i=0;i<=3;i++){for(j=0;j<=2-i;j++){putchar(' ');}for(k=0;k<2*i+1;k++){putchar('*');}putchar('');}for(i=0;i<=2;i++){for(j=0;j<=i;j++){putchar(' ');}for(k=0;k<5-2*i;k++)...
编写程序,输出从2000年至3000年所有闰年的年号,每输出10个年号换一行。判断公元年是否为闰年的条件是: #include<stdio.h>int main(){int year;int j;j=0;for(year=2000;year<=3000;year++){if(year%4==0&&(year%100!=0)||year%400==0){printf("%d ",year);j++;if(j%10==0){putchar('');}}}return 0;}
编写程序,求1-3+5-7+······-99+101的值 #include<stdio.h>int main(){int i;int j;int sum1;int sum2;sum1=0;sum2=0;for(i=1;i<=101;i=i+4){sum1=sum1+i;}for(j=3;j<99;j=j+4){sum2=sum2+j;}printf("1-3+5-7+······-99+101=%d",sum1-sum2);return 0;}
整型数越界情况 #include<stdio.h>int main(){int i;float n;//如果n定义成整型:int n;后面算出来的n将会越界,程序无法编译,所以选用实型变量float sum;sum=1.0;n=1.0;for(i=1;i<=49;i++){n=n*i;sum=sum+1/n;}printf("sum=%f",sum);return 0;}D:\>gcc jiecheng.cD:\>a.exes...
使用三目运算符创造printf的格式控制 #include<stdio.h>int main(){int x;for(x=3;x<6;x++){printf((x%2)?("**%d"):("##%d"),x);}return 0;}D:\>gcc sanmu.cD:\>a.exe**3##4**5D:\>