新手上路
- 积分
- 46
- 金钱
- 46
- 注册时间
- 2018-7-26
- 在线时间
- 11 小时
|
本帖最后由 878738424 于 2018-7-31 06:34 编辑
按键三个KO,K1,WK。
1)按下顺序有K0 K1 WK 和WK K1 K0。两种。
2)抢占优先级WK>K1>K0,子优先级一样;抢占优先级一样,子优先级WK>K1>K0。两种
3)程序执行代码分:三个按键只用一个标志;三个按键用三个标志。两种
共 2*2*2=8 种结果。为了便于观察中断服务函数被更高级的中断打断,所以故意在每个中断服务函数里面插入长时间延时(延时不准确,不改了,只是大概6秒),其实延时可以去掉但不好观察了。
感觉没错误。
以后再看看。
上传了彩色风格配置文件。里面有提示如何替换的。
8次结果,都是将处理器重启后截图的。每次重启都执行一次main函数,所以都重新输入进行配置。
以后再深入研究其他的。
延时时间已经修正正确,且改进了程序逻辑。
void delayus(u16 us)
{
u32 temp;
u16 i;
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8; //选择外部时钟 HCLK/8 即9M(/秒)
SysTick->LOAD=9-1; //装载值设定为9-1=8 即每1us设定一次标志 每一次算数1/9M (秒) = 1/9000 (ms), 计数9共1/1000(m)s,也就是1us 。
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
for(i = 0; i < us; i++) //每一个毫秒进一次循环,共一秒
{
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待1ms时间到达 CPU停留在此处执行读取标志位的指令
}
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//延时若干ms 输入不大于65535
void delayms(u16 ms)
{
u32 temp;
u16 i;
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8; //选择外部时钟 HCLK/8
SysTick->LOAD=9000-1; //装载值设定为9*1000-1=8999 即每1ms设定一次标志 1/9M (秒) = 1/9000 (ms), 计数9000共1ms
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
for(i = 0; i < ms; i++) //每一个毫秒进一次循环
{
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待1ms时间到达 CPU停留在此处执行读取标志位的指令
}
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//延时若干s
void delays(u16 s)
{
u32 temp;
u16 i,j;
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8; //选择外部时钟 HCLK/8
SysTick->LOAD=9000-1; //装载值设定为9*1000-1=8999 即每1ms设定一次标志 1/9M (秒) = 1/9000 (ms), 计数9000共1ms
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
for(j = 0; j < s; j++)
{
for(i = 0; i < 1000; i++) //1秒
{
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待1ms时间到达 CPU停留在此处执行读取标志位的指令
}
}
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
|
|