我个人比较看好touchgfx,免费,有比较丰富的库,可以基于图形化设计,减少人员的开发。STM32CUBEIDE和STM32CUBEMX都集成了touchgfx,可以在线下载。安装PC touchgfx,可以在PC独立开发,模拟运行,不知道啥时候正点原子能出一个touchgfx视频。
按键控制LED灯亮灭问题 1614230648(1).jpg (103.05 KB 下载次数: 0) 下载附件 保存到相册 2021-2-25 13:25 上传 P3.0和P3.1端口无法控制P1.0和P1.1的灯亮灭
想请问为什么经常看到一些中断服务函数都是要先判断是否发生中断才继续执行呢? 如果已经都能进入中断函数了,不就代表中断发生了吗? 例如下面定时器中断的if语句用来判断是否发生中断是不是多余的呢?没有if不行吗 //定时器3中断服务程序 void TIM3_IRQHandler(void) //TIM3中断 { if (TIM_GetITStatus(TIM3 TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否 { TIM_ClearITPendingBit(TIM3 TIM_IT_Update ); //清除TIMx更新中断标志 LED1=!LED1; } }
就是发送到串口1的数据,会被串口3中断接收到 好奇怪。 串口3没有复用;把pb11的浮空输入改成上拉或下拉输入都不行,都能收到 修改优先级也不行 实在搞不懂。 上来请教各位大神,先谢谢了
FATFS在裸机运行没问题,在FreeRTOS中,用FS指针可以挂在,用FS变量就会进硬件错误中断,而且用指针却不能打开文件,错误是文件无效。前提都是裸机没问题,请问一下?!
内部有2个APP。通过IAP跳转 想法是:做固件升级,内部放2个APP,一个是当前版本,一个是上一个版本。 2个APP互相轮询的烧录。 例如: APP1 keil编辑的起始地址0x8002000 向量表偏移0x2000。 APP2 keil编辑的起始地址0x8002000 。向量表偏移0x12000 ,APP2采用USB写入FLASH 0x8012000的地址。 IAP跳转 APP1 为0x8002000,跳转 APP2 为 0x8012000。 keil编辑的起始地址都是按照0x8002000,只是放到别的地址了,用IAP跳转到那个地址, 能运行吗? 我的思路能行吗?
接收的数据存入33H ~ 3FH 需要显示前11位 怎么用最少的程序显示出来 下面的程序只显示第一位(接收的第一位是A) 后面显示的是BCDEFGHIJK 显示的不是接收的数据 怎样才能把里面的数据显示出来 还有为什么接收时用的是#33H 显示的时候可以直接用33H显示 MOV R3#11; 显示数量 MOV R133H; 数据存放地址 MOV R2#0C2H; 显示地址 DIPA: MOV P1R2; INC R2; LCALL WR_CODE MOV AR1 INC R1 LCALL WR_DATA DJNZ R3DIPA
这次一个无源蜂鸣器驱动算是遇到问题了 此程序并非本人所写也是借鉴于论坛大神帖子的! 程序如下: 定时器为八位自动重装模式 定时250us; void timer() interrupt 1 { static uint16 count=0; uint16 count; if(num>0) { count++; if(count<400) { beep=~beep; if(count>=400) beep=1; if(count>=800) { count=0; num--; } } } } 求问:三个if里面的的数值都决定了蜂鸣器的什么状态?
例如128KB空间。程序占用空间40K. 通过升级,固件缩小到30K. 覆盖30K以后,后面10K是之前的残留,需要判断并擦除吗?还是留着不管也可以的?
一个非常简单的小程序,利用外部中断控制静态数码管和动态数码管轮流显示数字0~7,可是无论是实际下载到开发板还是用protues仿真都只有动态显示,无法切换到静态显示,代码也检查了许多遍,刚刚开始学51,不知道是不是算法的问题,恳求大佬帮忙指点一点,下面是代码。 #include <reg52.h> #define LED1 P1//静态数码管 #define LED2 P0//动态数码管 sbit c=P2^7; sbit b=P2^6; sbit a=P2^5; sbit k1=P3^2; sbit k2=P3^3; unsigned char code num[8]={0x3f0x060x5b0x4f0x660x6d0x7d0x07}; unsigned char M[8]; unsigned char k; void displayLED1(); void displayLED2(); void zhong_duan_kai_qi(); void delay(unsigned int time); void main() { zhong_duan_kai_qi();//外部中断开启 while(1) { unsigned char i; if(k) { LED2=0x00; while(k) { displayLED1(); } } else { for(i=0;i<8;i++) { M[i]=num[i]; } LED1=0x00; while(~k) { displayLED2(); } } } } void delay(unsigned int time) { unsigned char i; unsigned int j; for(i=0;i<time;i++) { for(j=0;j<125;j++); } } void zhong_duan_kai_qi() { //设置INT0 IT0=1;//跳变沿出发方式(下降沿) EX0=1;//打开INT0的中断允许。 //设置INT1 IT1=1; EX1=1; //打开总中断 EA=1; } void displayLED1() { unsigned char i; for(i=0;i<8;i++) { LED1=num[i]; delay(500); } } void displayLED2() { unsigned char i; unsigned int j; for(i=0;i<8;i++) { switch(i) { case 0: c=0;b=0;a=0;break; case 1: c=0;b=0;a=1;break; case 2: c=0;b=1;a=0;break; case 3: c=0;b=1;a=1;break; case 4: c=1;b=0;a=0;break; case 5: c=1;b=0;a=1;break; case 6: c=1;b=1;a=0;break; case 7: c=1;b=1;a=1;break; } LED2=M[i]; j=500; while(j--); LED2=0x00;//消隐 } } void Int0()interrupt 0 { delay(1);//延时消抖 if(k1==0) { k=0; } } void Int1()interrupt 2 { delay(1); if(k2==0) { k=1; } }
#include <reg52.h> #include <stdio.h> #include "lcd1602.h" //ADC0809 sbit CLK=P3^4; sbit ST=P3^5; sbit EOC=P3^6; sbit OE=P3^7; sbit RELAY = P3^3; unsigned int pass = 0; unsigned int ADCshow; unsigned char pressure = 50; unsigned char mode=0; unsigned char status = 0; void delay(unsigned int s) { while(s--); } void DelayMS(unsigned int ms) { unsigned char i; while(ms--) { for(i=0;i<120;i++); } } void Timer0_INT() interrupt 1 { TH0=(65536-200)/256; TL0=(65536-200)%256; CLK=~CLK; } void UART_init() //设置串行通信 本晶振为11.0592MHZ,其他的就自己算一下应该设置多少 { TMOD = 0x20; TH1 = 0xfd; TL1 = 0xfd; //波特率9600 SM0 = 0; SM1 = 1; // 串口工作方式1 10位异步 REN = 1; //串口允许接收 TR1 = 1; EA = 1; ES =1 ; //串口中断 } void main(void) { RELAY=1; //关灯 UART_init(); lcd_init(); //初始化1602 TMOD=0x01; //设置定时器0 TH0=(65536-200)/256; //初值重装 TL0=(65536-200)%256; EA=1; //开总中断 ET0=1; //开定时器中断 TR0=1; //开定时器0 while(1) { //adc0809读取数据 ST=0; OE=0; ST=1; ST=0; while(EOC==0); OE=1; ADCshow=P1; OE=0; //lcd1602显示压力传感器值 LCD_ShowStr(00"Real:"); LCD_ShowChar(50ADCshow/100+'0'); LCD_ShowChar(60ADCshow%100/10 +'0'); LCD_ShowChar(70ADCshow%10 +'0'); if(ADCshow<pressure||pass==0x11) { RELAY=0; //亮灯 } else { //否则 RELAY=1; //灭灯 } } } void UART_INTERRUPT() interrupt 4 { pass = SBUF; RI = 0; SBUF = pass; ) while(!TI); TI = 0; } 原理图
我新建了GD32的工程,用GD标准库,在测试滴答定时器中断时,发现中断能进去,但是进一次中断大概是7ms左右。我只把原来主频108M改成72M,原来108M系统初始化不了,进不去Main函数。
请问一下我在使用51最小系统板做流水灯的时候通过程序无法改变I/O输出电平是怎么回事,I/O持续输出5V高电平,但是把芯片换到另一个基座就可以改变,请问哪里可能出问题了