各位求大神指点的图片一下这个中断最后会是什么情况

!!!求各位大神点进来,帮我解释一下这个关于用中断控制LED灯亮灭出现的异常现象,万分感激!!! - ARM技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
!!!求各位大神点进来,帮我解释一下这个关于用中断控制LED灯亮灭出现的异常现象,万分感激!!!
<div class=""
& &请问各位大神,为什么在使用附件中的裸机程序在S3C2440A开发板上测试时,会出现虽然按键按下对应LED会点亮其余熄灭,但是按键抬起LED会全部恢复硬件初始状态(LED1-LED3自动全量)的现象,而不是保持对应LED常亮而其他熄灭的状态呢?(既然GPFDAT在中断服务程序中被赋值,后边又没有清除过,怎么会自己改变LED状态呢?)百思不得解,希望各位大神帮忙给出解释,万分感激!
下载积分: 积分 -1 分
3.1 KB, 下载次数: 2, 下载积分: 积分 -1 分
21:09:36  
该类别下有 16 个回答。
该类别下有 16 个回答。
该类别下有 13 个回答。
该类别下有 9 个回答。
该类别下有 8 个回答。
该类别下有 7 个回答。
该类别下有 7 个回答。
该类别下有 7 个回答。
该类别下有 6 个回答。
该类别下有 6 个回答。
该类别下有 6 个回答。
该类别下有 6 个回答。
该类别下有 6 个回答。
该类别下有 6 个回答。
该类别下有 5 个回答。
该类别下有 5 个回答。
该类别下有 5 个回答。
该类别下有 5 个回答。
该类别下有 5 个回答。
该类别下有 5 个回答。
& && &这个简单。
& && &你在在主程序里设置一个全局变量,在中断服务程序里将其取反,然后在主程序里判断其数值:=0则LED不亮;=1则LED全亮。这就是编程的思想。你可以写个小程序来测试一下。
触摸IC 识别IC 解决方案
电容式触摸感应IC、触摸开关IC、触摸调光IC、单键触摸IC、多键触摸芯片、触摸按键IC、触摸屏芯片、电容式触摸IC、触摸LED调光、金属壳台灯触摸调光IC、无极调光触摸IC、无段调光触摸IC、4段调光触摸IC、3段调光触摸IC、AC单切调光开关、AC三键调光开关
LED控制方案
电容式触摸感应IC、触摸开关IC、触摸调光IC、单键触摸IC、多键触摸芯片、触摸按键IC、触摸屏芯片、电容式触摸IC、触摸LED调光、金属壳台灯触摸调光IC、无极调光触摸IC、无段调光触摸IC、4段调光触摸IC、3段调光触摸IC、AC单切调光开关、AC三键调光开关
一楼,你是XX派来的豆B吗?
可能是,程序设定按键按下后输入低电平吧
可能是,程序设定按键按下后输入低电平吧
看起来好厉害的样子,可是我完全不懂,有没有大神能够解释一下
这个简单。
& && &你在在主程序里设置一个全局变量,在中断服务程序里将其取反,然后在主程序里判断其数值:=0则LED不亮;=1则LED全亮。这就是编程的思想。你可以写个小程序来测试一下。
但是并不能解释出现这个现象的原因吧,求解释
但是并不能解释出现这个现象的原因吧,求解释
怎么说呢。这个要看程序了,具体问题具体分析。没看你附件里的程序不能妄言。
怎么说呢。这个要看程序了,具体问题具体分析。没看你附件里的程序不能妄言。
那您到是帮忙看一下呀,谢了
那您到是帮忙看一下呀,谢了
你都懒得贴上来,我为啥不能懒得看呢?!
你都懒得贴上来,我为啥不能懒得看呢?!@******************************************************************************
@ File:head.S
@ 功能:初始化,设置中断模式、管理模式的栈,设置好中断处理函数
@******************************************************************************& && &
.extern& &&&main
.text & & & &
.global _start
_start:& &
@******************************************************************************& && &
@ 中断向量,本程序中,除Reset和HandleIRQ外,其它异常都没有使用
@******************************************************************************& && &
& & b& &Reset
@ 0x04: 未定义指令中止模式的向量地址
HandleUndef:
& & b& &HandleUndef
@ 0x08: 管理模式的向量地址,通过SWI指令进入此模式
HandleSWI:
& & b& &HandleSWI
@ 0x0c: 指令预取终止导致的异常的向量地址
HandlePrefetchAbort:
& & b& &HandlePrefetchAbort
@ 0x10: 数据访问终止导致的异常的向量地址
HandleDataAbort:
& & b& &HandleDataAbort
@ 0x14: 保留
HandleNotUsed:
& & b& &HandleNotUsed
@ 0x18: 中断模式的向量地址
& & b& &HandleIRQ
@ 0x1c: 快中断模式的向量地址
HandleFIQ:
& & b& &HandleFIQ
Reset:& && && && && && &
& & ldr sp, =4096& && && &&&@ 设置栈指针,以下都是C函数,调用前需要设好栈
& & bl&&disable_watch_dog& &@ 关闭WATCHDOG,否则CPU会不断重启
& &
& & msr cpsr_c, #0xd2& && & @ 进入中断模式
& & ldr sp, =3072& && && &&&@ 设置中断模式栈指针
& & msr cpsr_c, #0xd3& && & @ 进入管理模式
& & ldr sp, =4096& && && &&&@ 设置管理模式栈指针,
& && && && && && && && && & @ 其实复位之后,CPU就处于管理模式,
& && && && && && && && && & @ 前面的“ldr sp, =4096”完成同样的功能,此句可省略
& & bl&&init_led& && && && &@ 初始化LED的GPIO管脚
& & bl&&init_irq& && && && &@ 调用中断初始化函数,在init.c中
& & msr cpsr_c, #0x5f& && & @ 设置I-bit=0,开IRQ中断
& &
& & ldr lr, =halt_loop& && &@ 设置返回地址
& & ldr pc, =main& && && &&&@ 调用main函数
& & & &
halt_loop:
& & b& &halt_loop
HandleIRQ:
& & sub lr, lr,#4& && && && && && & @ 计算返回地址
& & stmfd& &sp!,& & { r0-r12,lr }& &@ 保存使用到的寄存器
& && && && && && && && && && && && &@ 注意,此时的sp是中断模式的sp
& && && && && && && && && && && && &@ 初始值是上面设置的3072
& &
& & ldr lr, =int_return& && && && & @ 设置调用ISR即EINT_Handle函数后的返回地址&&
& & ldr pc, =EINT_Handle& && && && &@ 调用中断服务函数,在interrupt.c中
int_return:
& & ldmfd& &sp!,& & { r0-r12,pc }^&&@ 中断返回, ^表示将spsr的值复制到cpsr
& &
/******************************
/*
* init.c: 进行一些初始化,初始化函数定义文件
#include &s3c24xx.h&
* LED1,LED2,LED4对应GPF0、GPF1、GPF2
*/
#define& & & & GPF0_out& & & & (0x1&&(0*2))
#define& & & & GPF1_out& & & & (0x1&&(1*2))
#define& & & & GPF2_out& & & & (0x1&&(2*2))
#define& & & & GPF0_msk& & & & (3&&(0*2))
#define& & & & GPF1_msk& & & & (3&&(1*2))
#define& & & & GPF2_msk& & & & (3&&(2*2))
* S1,S2,S3对应GPF4、GPF5、GPG6
*/
#define GPF4_eint& & (0x2&&(4*2))
#define GPF5_eint& &&&(0x2&&(5*2))
#define GPF6_eint& &&&(0x2&&(6*2))
#define GPF4_msk& & (3&&(4*2))
#define GPF5_msk& & (3&&(5*2))
#define GPF6_msk& & (3&&(6*2))
* 关闭WATCHDOG,否则CPU会不断重启
*/
void disable_watch_dog(void)
{
& & WTCON = 0;&&// 关闭WATCHDOG很简单,往这个寄存器写0即可
}
void init_led(void)
{
& & // LED1,LED2,LED3对应的3根引脚设为输出
& & GPFCON &= ~(GPF0_msk | GPF1_msk | GPF2_msk);
& & GPFCON |= GPF0_out | GPF1_out | GPF2_
& & GPFDAT = 0xf0;
& & GPFUP = 0x00;
}
* 初始化GPIO引脚为外部中断
* GPIO引脚用作外部中断时,默认为低电平触发、IRQ方式(不用设置INTMOD)
void init_irq( )
{
& & // S1,S2,S3对应的3根引脚设为中断引脚 EINT4,EINT5,EINT6
& & GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk);
& & GPFCON |= GPF4_eint | GPF5_eint | GPF6_
& & // S4对应的引脚设为中断引脚EINT11
& & //GPFCON &= ~GPF3_
& & //GPFCON |= GPF3_
& &
& & // 对于EINT11,需要在EINTMASK寄存器中使能它
& & //EINTMASK &= ~(1&&11);
& && &&&
& & /*
& &&&* 设定优先级:
& &&&* ARB_SEL0 = 00b, ARB_MODE0 = 0: REQ1 & REQ3,即EINT0 & EINT2
& &&&* 仲裁器1、6无需设置
& &&&* 最终:
& &&&* EINT0 & EINT2 & EINT11即K2 & K3 & K4
& &&&*/
& & //PRIORITY = (PRIORITY & ((~0x01) | (0x3&&7))) | (0x0 && 7) ;
& & // EINT4_7使能
& & EINTMASK &= ~((1&&4)|(1&&5)|(1&&6));
& & INTMSK& &&= (~(1&&4));
}
/*******************************
/interrupt.c中断处理文件
#include &s3c24xx.h&
void EINT_Handle()
{
& & unsigned long oft = INTOFFSET;
& &
& & if( oft==4 )
& & {
& && &&&SRCPND = 1&&
& && &&&INTPND = 1&&
& && &&&// S1被按下
& && &&&if(EINTPEND&(1&&4))
& && &&&{& &
& && && && &//GPFDAT |= (0x7&&0);& &// 所有LED熄灭
& && && && &//GPFDAT &= ~(1&&0);& && &// LED1点亮
& & & & & & & & & & & & GPFDAT = 0
& && && && &EINTPEND |= (1&&4);
& && &&&}
& && &&&
& && &&&// S2被按下
& && &&&if(EINTPEND&(1&&5))
& && &&&{& &
& && && && &GPFDAT |= (0x7&&0);& &// 所有LED熄灭
& && && && &GPFDAT &= ~(1&&1);& && &// LED2点亮
& && && && &EINTPEND |= (1&&5);
& && &&&}
& && &&&// S3被按下
& && &&&if(EINTPEND&(1&&6))
& && &&&{& &
& && && && &GPFDAT |= (0x7&&0);& &// 所有LED熄灭
& && && && &GPFDAT &= ~(1&&2);& && &// LED4点亮& && && && && &
& && && && &EINTPEND |= (1&&6);
& && &&&}
}
/**************************************************************************************
/**main.c文件
int main()
{& &
& & while(1);
& & return 0;
}
/***************************************************************************************
/***寄存器定义文件
/* WOTCH DOG register */
#define& &&&WTCON& && && &&&(*(volatile unsigned long *)0x)
/* SDRAM regisers */
#define& &&&MEM_CTL_BASE& & 0x
#define& &&&SDRAM_BASE& && &0x
/* NAND Flash registers */
#define NFCONF& && && && &&&(*(volatile unsigned int&&*)0x4e000000)
#define NFCMD& && && && && &(*(volatile unsigned char *)0x4e000004)
#define NFADDR& && && && &&&(*(volatile unsigned char *)0x4e000008)
#define NFDATA& && && && &&&(*(volatile unsigned char *)0x4e00000c)
#define NFSTAT& && && && &&&(*(volatile unsigned char *)0x4e000010)
/*GPIO registers*/
#define GPBCON& && && && &&&(*(volatile unsigned long *)0x)
#define GPBDAT& && && && &&&(*(volatile unsigned long *)0x)
#define GPFCON& && && && &&&(*(volatile unsigned long *)0x)
#define GPFDAT& && && && &&&(*(volatile unsigned long *)0x)
#define GPFUP& && && && && &(*(volatile unsigned long *)0x)
#define GPGCON& && && && &&&(*(volatile unsigned long *)0x)
#define GPGDAT& && && && &&&(*(volatile unsigned long *)0x)
#define GPGUP& && && && && &(*(volatile unsigned long *)0x)
#define GPHCON& && && && &&&(*(volatile unsigned long *)0x)
#define GPHDAT& && && && &&&(*(volatile unsigned long *)0x)
#define GPHUP& && && && && &(*(volatile unsigned long *)0x)
/*UART registers*/
#define ULCON0& && && && &&&(*(volatile unsigned long *)0x)
#define UCON0& && && && && &(*(volatile unsigned long *)0x)
#define UFCON0& && && && &&&(*(volatile unsigned long *)0x)
#define UMCON0& && && && &&&(*(volatile unsigned long *)0x5000000c)
#define UTRSTAT0& && && && &(*(volatile unsigned long *)0x)
#define UTXH0& && && && && &(*(volatile unsigned char *)0x)
#define URXH0& && && && && &(*(volatile unsigned char *)0x)
#define UBRDIV0& && && && & (*(volatile unsigned long *)0x)
/*interrupt registes*/
#define SRCPND& && && && &&&(*(volatile unsigned long *)0x4A000000)
#define INTMOD& && && && &&&(*(volatile unsigned long *)0x4A000004)
#define INTMSK& && && && &&&(*(volatile unsigned long *)0x4A000008)
#define PRIORITY& && && && &(*(volatile unsigned long *)0x4A00000c)
#define INTPND& && && && &&&(*(volatile unsigned long *)0x4A000010)
#define INTOFFSET& && && &&&(*(volatile unsigned long *)0x4A000014)
#define SUBSRCPND& && && &&&(*(volatile unsigned long *)0x4A000018)
#define INTSUBMSK& && && &&&(*(volatile unsigned long *)0x4A00001c)
/*external interrupt registers*/
#define EINTMASK& && && && &(*(volatile unsigned long *)0x)
#define EINTPEND& && && && &(*(volatile unsigned long *)0x)
@hougue,方便加个好友?微
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 26, 距离下一级还需 174 积分
论坛徽章:0
一直不太清楚这个,哪位大神帮我解释下,
我想知道在轮询模式下,中断位还有用么?哪它是怎样获取数据的,多长时间取一次,在哪取?
哪取得地方的数据是由哪获取的,是不是还是有中断来了?
白手起家, 积分 99, 距离下一级还需 101 积分
论坛徽章:0
不知道你具体想问什么,能不能有条理一点,在这里想得到答案,很难,如果连你自己把问题也说不清楚,那别人更不好回答你的提问了。
白手起家, 积分 8, 距离下一级还需 192 积分
论坛徽章:0
新人学习中~期待解答
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处外部中断只能响应一次,求大神指点! - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 839|回复: 7
外部中断只能响应一次,求大神指点!
在线时间1 小时
该用户从未签到主题帖子精华
新手上路, 积分 11, 距离下一级还需 39 积分
使用PB12,PB13,PE14,PE15作为外部中断,PE14,PE15响应正常,但PB12,PB13无法正常进入中断,代码如下,求指点。。
void EXTI15_10_IRQHandler(void)
& & & & //KEY_OK
& & & & if(EXTI_GetITStatus(EXTI_Line14)==SET)
& & & & & & & & {& & & & & & & & & & & &
& & & & & & & & & & & & IO_OutputData(0x00);
& & & & & & & & & & & & delay_us(10);
& & & & & & & & & & & & EXTI_ClearITPendingBit(EXTI_Line14);& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & }
& & & & & & & &
& & & & //KEY_UP
& & & & if(EXTI_GetITStatus(EXTI_Line15)==SET)
& & & & & & & & {& & & & & & & & & & & &
& & & & & & & & & & & & IO_OutputData(0xff);
& & & & & & & & & & & & delay_us(10);
& & & & & & & & & & & & EXTI_ClearITPendingBit(EXTI_Line15);& & & & & & & & & & & &
& & & & & & & & }
& & & & //KEY_DOWN
& & & & if(EXTI_GetITStatus(EXTI_Line12)==SET)
& & & & & & & & {
& & & & & & & & & & & &
& & & & & & & & & & & & IO_OutputData(0xff);
& & & & & & & & & & & & delay_us(10);
& & & & & & & & & & & & EXTI_ClearITPendingBit(EXTI_Line12);& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & }
& & & & & & & &
& & & & //KEY_CANCEL
& & & & if(EXTI_GetITStatus(EXTI_Line13)==SET)
& & & & & & & & {& & & & & & & & & & & &
& & & & & & & & & & & & IO_OutputData(0x00);
& & & & & & & & & & & & delay_us(10);
& & & & & & & & & & & & EXTI_ClearITPendingBit(EXTI_Line13);& & & & & & & &
& & & & & & & & }
----------------------------------------------------------------------
void NVIC_Configuration(void)
& & & & NVIC_InitTypeDef NVIC_InitS
& & & & NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);& & & &
& & & & NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;& & & &&&
& & & & NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
& & & & NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
& & & & NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
& & & & NVIC_Init(&NVIC_InitStructure);
& & & & NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;& & & &&&
& & & & NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
& & & & NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
& & & & NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
& & & & NVIC_Init(&NVIC_InitStructure);& & & & & & & &
--------------------------------------------------------------------------------------
void KEY_config(void)
& & & & GPIO_InitTypeDef& & & & GPIO_InitS
& & & & EXTI_InitTypeDef& & & & EXTI_InitS
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);& & & &
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);& & & &
& & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
& & & & //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
& & & & GPIO_InitStructure.GPIO_Pin = KEY_OK& & & & |& & & & KEY_UP;
& & & & GPIO_Init(GPIOE, &GPIO_InitStructure);& & & &
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);& & & & & & & &
& & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
& & & & //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
& & & & GPIO_InitStructure.GPIO_Pin = KEY_DOWN& & & & |& & & & KEY_CANCEL;
& & & & GPIO_Init(GPIOB, &GPIO_InitStructure);
& & & & GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource14);
& & & & EXTI_InitStructure.EXTI_Line = EXTI_Line14 ;
& & & & EXTI_InitStructure.EXTI_Mode = EXTI_Mode_I
& & & & EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_F
& & & & EXTI_InitStructure.EXTI_LineCmd = ENABLE; & & & & & & & & & & & &
& & & & EXTI_Init(&EXTI_InitStructure);
& & & & GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource15);
& & & & EXTI_InitStructure.EXTI_Line = EXTI_Line15 ;
& & & & EXTI_InitStructure.EXTI_Mode = EXTI_Mode_I
& & & & EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_F
& & & & EXTI_InitStructure.EXTI_LineCmd = ENABLE; & & & & & & & & & & & &
& & & & EXTI_Init(&EXTI_InitStructure);&&& & & &
& & & & GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);
& & & & EXTI_InitStructure.EXTI_Line = EXTI_Line12 ;
& & & & EXTI_InitStructure.EXTI_Mode = EXTI_Mode_I
& & & & EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_F
& & & & EXTI_InitStructure.EXTI_LineCmd = ENABLE; & & & & & & & & & & & &
& & & & EXTI_Init(&EXTI_InitStructure);&&& & & &
& & & & GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource13);
& & & & EXTI_InitStructure.EXTI_Line = EXTI_Line13;
& & & & EXTI_InitStructure.EXTI_Mode = EXTI_Mode_I
& & & & EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_F & & & &
& & & & EXTI_InitStructure.EXTI_LineCmd = ENABLE; & & & & & & & & & & & &
& & & & EXTI_Init(&EXTI_InitStructure);&&
& & & & EXTI_ClearITPendingBit(EXTI_Line12);
& & & & EXTI_ClearITPendingBit(EXTI_Line13);
& & & & EXTI_ClearITPendingBit(EXTI_Line14);
& & & & EXTI_ClearITPendingBit(EXTI_Line15);
& & & & & & & & & & & &
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间144 小时
该用户从未签到主题帖子精华
金牌会员, 积分 1923, 距离下一级还需 3077 积分
在EXTI_ClearITPendingBit(EXTI_Line12);之前加一句EXTI_ClearFlag(EXTI_Line12);试试
在线时间1 小时
该用户从未签到主题帖子精华
新手上路, 积分 11, 距离下一级还需 39 积分
在EXTI_ClearITPendingBit(EXTI_Line12);之前加一句EXTI_ClearFlag(EXTI_Line12);试试
试了,没能解决问题,这两个函数是一样的吧
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间2 小时
该用户从未签到主题帖子精华
新手上路, 积分 35, 距离下一级还需 15 积分
如果12,13可以进入一次的话,可能配置没啥问题,将你的IO_OutputData贴出来看看,是不是在里面修改了12,13管脚的属性了
在线时间1 小时
该用户从未签到主题帖子精华
新手上路, 积分 11, 距离下一级还需 39 积分
如果12,13可以进入一次的话,可能配置没啥问题,将你的IO_OutputData贴出来看看,是不是在里面修改了12,1 ...
void IO_OutputData(u8 DATA)
& & & & u8 IO_E,IO_B_L,IO_B_H;
& & & & IO_E& & & & & & & & =& & & & ((DATA&0x01)&&1)|((DATA&0x02)&&1);& & & &
& & & & IO_B_H& & & & =& & & & ((DATA&0x04)&&1)|((DATA&0x08)&&3);
& & & & IO_B_L& & & & =& & & & ((DATA&0x10)&&2)|((DATA&0x40)&&2)|(DATA&0x20)|((DATA&0x80)&&4);
& & & & GPIOE-&BSRR = (IO_E & 0xff) | (~IO_E & 0xff)&&16;& & & &
& & & & GPIOB-&BSRR = (IO_B_L & 0xff)& & & & |& & & & (IO_B_H & 0xff)&&8& & & & |& & & & (~IO_B_L & 0xff)&&16& & & & |& & & & (~IO_B_H & 0xff)&&24;
求大神指点
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间13 小时
该用户从未签到主题帖子精华
中级会员, 积分 229, 距离下一级还需 271 积分
是不是不能在中断中有延时?为什么在中断中延时delay_us(10)?
在线时间1 小时
该用户从未签到主题帖子精华
新手上路, 积分 11, 距离下一级还需 39 积分
如果12,13可以进入一次的话,可能配置没啥问题,将你的IO_OutputData贴出来看看,是不是在里面修改了12,1 ...
已解决,果然是 IO_OutputData的问题
void IO_OutputData(u8 DATA)
& & & & u8 IO_E,IO_B_L,IO_B_H;
& & & & IO_E& & & & & & & & =& & & & ((DATA&0x01)&&1)|((DATA&0x02)&&1);& & & &
& & & & IO_B_H& & & & =& & & & ((DATA&0x04)&&1)|((DATA&0x08)&&3);
& & & & IO_B_L& & & & =& & & & ((DATA&0x10)&&2)|((DATA&0x40)&&2)|(DATA&0x20)|((DATA&0x80)&&4);
& & & & GPIOE-&BSRR = (IO_E & 0xff) | (~IO_E & 0xff)&&16;& & & &
& & & & GPIOB-&BSRR = (IO_B_L & 0xff)& & & & |& & & & (~IO_B_L & 0xff)&&16& & & & |& & & & (IO_B_H & 0x03)&&8& & & & |& & & & (~IO_B_H & 0x03)&&24;
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间2 小时
该用户从未签到主题帖子精华
新手上路, 积分 35, 距离下一级还需 15 积分
已解决,果然是 IO_OutputData的问题
void IO_OutputData(u8 DATA)
兄弟,如果解决了问题,把我的回复设为最佳答案啊,这样咱俩都有金币得了
站长推荐 /3
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered by查看: 1155|回复: 6
求大神帮忙看一下lcd1602程序 是不是定时中断哪里出问题了
30.6后面的东西不晓得咋出来的,下面T2后面本来是通过按键设定数值的,现在也不行了,是不是定时中断哪里出问题了&&,求大神指点指点。(这是主程序,问题就这这里面就是不晓得在哪里)
#include &reg52.h&
#include&stdlib.h&
#include&intrins.h&
sbit RELAY = P2^4;& && && && && && &&&//定义继电器对应单片机管脚
bit flag1s = 0;& && && & //1s定时标志
unsigned char T0RH = 0;&&//T0重载值的高字节
unsigned char T0RL = 0;&&//T0重载值的低字节
unsigned char T1RH = 0;&&//T0重载值的高字节
unsigned char T1RL = 0;&&//T0重载值的低字节
extern bit Start18B20();
extern bit Get18B20Temp(int *temp);
extern void InitLcd1602();
extern void LcdShowStr(unsigned char *str);
extern void LcdSetCursor(unsigned char addr);
extern void LcdWriteDat(unsigned char dat);
extern void LcdWriteCmd(unsigned char del);
extern void&&keyscan();
extern unsigned char key,flag1;
unsigned char a[7];& && &&&
/**********************/
struct& && &&&_pid{
float SV;//用户设定温度
float PV; //测量温度
float KP; //比例常数
float T;&&//PID计算周期--采样周期
float TI;& && &&&//积分常数
float TD;& && && &//微分常数& && && && && &
float EK;&&//本次偏差
float EK_1;//上次偏差
float SEK; //历史偏差之和& && &&&
float IOUT;//积分输出
float POUT; //比例输出
float DOUT;//微分输出& && &&&
float OUT0;
float OUT;& && && && && &
unsigned int&&C10& && &&&
unsigned char&&//pwm周期& && &&&
}PID;
/********************************************/
void pid_init()
{
PID.KP=20;
PID.T=1000;
PID.TI=5000;
PID.TD=1200;
PID.pwmcycle=1000;//PWM的周期
}
/***********************************************/
void ConfigTimer0(unsigned int ms);
void ConfigTimer1(unsigned int ms1);
void pid_calc(); //PID计算
void pid_out();& && && &//PID输出结果到负载
void main()
{
&&& && &&&
&&unsigned char i,e=0;
&&unsigned char IntToString(unsigned char *str, int dat);
&&unsigned char code table[]={'0','1','2','3','4','5','6','7','8','9', '.','-',':',' ','=','.'};
&&
&&& && &&&//读取到的当前温度值
&&int intT, decT;&&//温度值的整数和小数部分
&&
&&unsigned char str[5];
&&unsigned char stt[16] = {&T1:&};
&&unsigned char sty[16] = {&T2:&};
& && &&&
&&EA = 1;& && && && &//开总中断
&&ConfigTimer0(10);&&//T0定时10ms
&&ConfigTimer1(1);&&//T1定时1ms
&&Start18B20();& && &//启动DS18B20
&&InitLcd1602();& &&&//初始化液晶
&&pid_init() ;
&&LcdWriteCmd(0x0C); //关闭光标闪烁
/*实时温度*/
&&while(1)
& &{& && && && &
/*显示实时温度标识&T1:&*/
& & LcdSetCursor(0x00);& && && && && &
& & m = 0;
& & while(stt[m] != '\0')
& &&&{& && && && && && && && &
& && & LcdWriteDat(stt[m]);
& && & m++;
& &&&}
/*显示设定温度标识&T2:&*/
& && &&&LcdSetCursor(0x40);& && && && && &
& & m = 0;
& & while(sty[m] != '\0')
& &&&{& && && && && && && && &
& && & LcdWriteDat(sty[m]);
& && & m++;
& &&&}
& && && &&&if (flag1s)&&//每秒更新一次温度
& && &&&{
& && &&&flag1s = 0;& && && &
& && &&&res = Get18B20Temp(&temp);&&//读取当前温度
& && &&&if (res)& && && && && && &&&//读取成功时,刷新当前温度显示
& && &&&{& && && &
& && &&&intT = temp && 4;& && && && & //分离出温度值整数部分
& && &&&decT = temp & 0xF;& && && && &//分离出温度值小数部分
& && &&&len = IntToString(str, intT); //整数部分转换为字符串
& && &&&str[len++] = '.';& && && && & //添加小数点
& && &&&decT = (decT*10) / 16;& && &&&//二进制的小数部分转换为1位十进制位
& && &&&str[len++] = decT + '0';& && &//十进制小数位再转换为ASCII字符
& && &&&LcdShowStr(str);& && &&&//显示到液晶屏上
& && &&&Start18B20();& && && && && && && && &
& && &&&PID.PV=atof(str);& && && && && && && && && && && && && && && && && && &&&
& && &&&}& && &&&
& && &&&}
&&/*设定温度*/& && && && && && && &&&
& && && &&&keyscan();& && && && && && && && && && && &
& && && &&&if(flag1==1)&&
& && && && &{
& && && &if(key&11)& && &//10以下是数字显示部分&&
& && && & {
& && && && && &LcdSetCursor(0x43+e++) ;
& && && && && &LcdWriteDat(table[key]);& &
& && && && && &a[i]=table[key];& &
& && && && && &i++;
& && && && && &PID.SV=atof(&a);
& && && && && && &
& && && && &&&}& && &&&
& && && && &&&else if(key==11)
& && && && && &{& && &&&
& && && && && &LcdWriteCmd(0x01) ;& && && &//删除设定值
& && && && && && & e=0;
& && && && && &for(i=0;i&7;i++)
& && && && && &{& && && &
& && && && && && &&&a[i]='0';
& && && && && &}
& && && && &&&}
& && && && & flag1=0;& && &&&//键盘检测标志置0进行下一次检测& && &&&
& && && && & }
& && && & pid_calc();& && &&&
}
}& && &
/* 整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度 */
unsigned char IntToString(unsigned char *str, int dat)
{
&&signed char i = 0;
&&unsigned char len = 0;
&&unsigned char buf[6];
&&if (dat & 0)&&//如果为负数,首先取绝对值,并在指针上添加负号
& &{
& & dat = -
& & *str++ = '-';
& & len++;
& &}
& & do
& && &&&{& && && & //先转换为低位在前的十进制数组
& &&&buf[i++] = dat % 10;
& &&&dat /= 10;
& & } while (dat & 0);
& & len +=& &&&//i最后的值就是有效字符的个数
& & while (i-- & 0)& &//将数组值转换为ASCII码反向拷贝到接收指针上
& & {
& &&&*str++ = buf[i] + '0';
& & }
& & *str = '\0';&&//添加字符串结束符
& && &//返回字符串长度
}
/* 配置并启动T0,ms-T0定时时间 10ms*/
void ConfigTimer0(unsigned int ms)
{
& &&&//临时变量
/ 12;& && &//定时器计数频率
& & tmp = (tmp * ms) / 1000;&&//计算所需的计数值
& & tmp = 65536 -& && &&&//计算定时器重载值
& & tmp = tmp + 12;& && && &&&//补偿中断响应延时造成的误差
& & T0RH = (unsigned char)(tmp&&8);&&//定时器重载值拆分为高低字节
& & T0RL = (unsigned char)
& & TMOD &= 0xF0;& &//清零T0的控制位
& & TMOD |= 0x01;& &//配置T0为模式1
& & TH0 = T0RH;& &&&//加载T0重载值
& & TL0 = T0RL;& && && &
& & ET0 = 1;& && &&&//使能T0中断
& & TR0 = 1;& && &&&//启动T0
}
/* T0中断服务函数,10ms一次,完成1秒定时 */
void InterruptTimer0() interrupt 1
{
& & static unsigned char tmr1s = 0;
& & TH0 = T0RH;&&//重新加载重载值
& & TL0 = T0RL;
& & tmr1s++;
& && &&&PID.C10ms++;
& & if (tmr1s &= 100)&&//定时1s
& & {
& && &&&tmr1s = 0;
& && &&&flag1s = 1;
& & }
}
/* 配置并启动T1,ms-T1定时时间1ms */
void ConfigTimer1(unsigned int ms1)
{
& & unsigned long tmp1;&&//临时变量
& & tmp1 =
/ 12;& && &//定时器计数频率
& & tmp1 = (tmp1 * ms1) / 1000;&&//计算所需的计数值
& & tmp1 = 65536 - tmp1;& && &&&//计算定时器重载值
& & tmp1 = tmp1 + 12;& && && &&&//补偿中断响应延时造成的误差
& & T1RH = (unsigned char)(tmp1&&8);&&//定时器重载值拆分为高低字节
& & T1RL = (unsigned char)tmp1;
& & TMOD &= 0xF0;& &//清零T1的控制位
& & TMOD |= 0x01;& &//配置T1为模式1
& & TH1 = T1RH;& &&&//加载T1重载值
& & TL1 = T1RL;& && && &
& & ET1 = 1;& && &&&//使能T1中断
& & TR1 = 1;& && &&&//启动T1
}
/* T1中& && &&&断服务函数,1ms一次 */
void InterruptTimer1() interrupt 3
{&&
& & TH1 = T1RH;&&//重新加载重载值
& & TL1 = T1RL;
//& && &&&PID.C10ms++;
& & pid_out(); //输出PID运算结果到负载
}
void pid_calc()
{
float DELEK;
if(PID.C10ms&(PID.T/10))
{}
&&PID.EK=PID.SV-PID.PV;& && &&&//当前偏差
&&PID.POUT=PID.KP*PID.EK;//比例输出
&&PID.SEK+=PID.EK;& && && && && & //历史偏差
&&DELEK=PID.EK-PID.EK_1;//最近两次偏差之差
&&ti=PID.T/PID.TI;
&&ki=ti*PID.KP;
&&PID.IOUT=ki*PID.SEK*PID.KP;& &//积分输出
&&td=PID.TD/PID.T;
&&kd=PID.KP*
&&PID.DOUT=kd*DELEK;
&&PID.OUT=PID.POUT+PID.IOUT+PID.DOUT+PID.OUT0;//计算结果
&&if(PID.OUT&PID.pwmcycle)
&&{PID.OUT=PID.}
&&if(PID.OUT&0)
&&{PID.OUT=0;}
&&PID.OUT=
&&PID.EK_1=PID.EK;//更新偏差
&&PID.C10ms=0;
}
void pid_out()& && && &//每一毫秒运算一次
{
& &sta
& &pw++;
& &if(pw&PID.pwmcycle)& && &&&//pw=0-999
& &{pw=0;}
& &if(pw&PID.OUT)
& &{
& && && &RELAY=0;//加热
& &}
& &else
& &{
& &&&RELAY=1;//停止加热
& &}
}
复制代码
好好检查一下,实在不行就重新写
这种冗长程序很少有人愿意去看的,想想为什么?正确可行的途径是自己阅读参考正确的案例程序。为此,给你一个正确可靠的案例参考,自己去钻研吧!别人不会有太多时间和兴趣。
RE: 求大神帮忙看一下lcd1602程序 是不是定时中断哪里出问题了
这个程序编译都不成功,缺少很多子程序。如18B02时序设定,读写和温度采集。如1602参数设定,1602数据输入,1602初始化。等等。说以不可能有显示。
先把显示程序调好,再加其他功能
先把显示程序调好,再加其他功能
显示程序调试好的了&&就是后面加了个PID控制就这样了
估计是LCD的时序被其他程序影响了,把LCD程序放到没有其他用处的定时器里,定时刷新
Powered by

我要回帖

更多关于 求大神指点的图片字 的文章

 

随机推荐