5、3个LED任务闪烁
1、代码例程:
1 /***************************************************************************************************************************** 2 * 3 * 文件名称:main.c 4 * 文件功能:主函数 5 * 文件说明:无 6 * 7 *****************************************************************************************************************************/ 8 /********************************************************** 9 * 10 * 头文件声明 11 * 12 **********************************************************/ 13 14 #include "pbdata.h" 15 16 17 18 19 20 /********************************************************** 21 * 22 * 任务相关设置 23 * 24 **********************************************************/ 25 /*开始任务*/ 26 #define START_TASK_PRIO 9 //设置任务优先级 27 #define START_STK_SIZE 64 //空间大小=64*4(字节) 28 OS_STK START_TASK_STK[START_STK_SIZE];//创建任务堆栈空间 29 30 /*LED1任务*/ 31 #define LED1_TASK_PRIO 6 //设置任务优先级 32 #define LED1_STK_SIZE 64 //空间大小=64*4(字节) 33 OS_STK LED1_TASK_STK[LED1_STK_SIZE];//创建任务堆栈空间 34 35 /*LED2任务*/ 36 #define LED2_TASK_PRIO 7 //设置任务优先级 37 #define LED2_STK_SIZE 64 //空间大小=64*4(字节) 38 OS_STK LED2_TASK_STK[LED2_STK_SIZE];//创建任务堆栈空间 39 40 41 /*LED3任务*/ 42 #define LED3_TASK_PRIO 8 //设置任务优先级 43 #define LED3_STK_SIZE 64 //空间大小=64*4(字节) 44 OS_STK LED3_TASK_STK[LED3_STK_SIZE];//创建任务堆栈空间 45 46 47 48 49 /********************************************************** 50 * 51 * 调用函数声明 52 * 53 **********************************************************/ 54 void RCC_Configuration(void);//时钟配置函数 55 56 void start_task(void *pdata);//开始任务函数 57 58 59 60 61 62 /********************************************************** 63 * 64 * 主函数 65 * 66 **********************************************************/ 67 int main(void) 68 { 69 Delay_Init();//延时函数初始化 70 71 RCC_Configuration();//时钟配置 72 73 LED_GPIO();//LED的GPIO引脚配置 74 75 76 /*操作系统的处理*/ 77 OSInit();//初始化UCOS操作系统 78 OSTaskCreate( 79 start_task, //指向任务代码的指针 80 (void *)0, //任务开始执行时,传递给任务参数的指针 81 (OS_STK *) & START_TASK_STK[START_STK_SIZE-1],//分配给任务堆栈的栈顶指针 82 START_TASK_PRIO//分配给任务的优先级 83 ); 84 OSStart();//启动OS操作系统 85 86 87 88 89 } 90 91 92 93 /********************************************************** 94 * 95 * 函数名称:RCC_Configuration(void) 96 * 函数功能:时钟配置 97 * 输入参数:无 98 * 输出参数:无 99 * 函数说明:无 100 * 101 **********************************************************/ 102 void RCC_Configuration(void) 103 { 104 SystemInit();//系统初始化 105 106 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//LED1对应GPIO时钟使能 107 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//LED2、LED3对应GPIO时钟使能 108 } 109 110 111 112 113 114 115 /********************************************************** 116 * 117 * 函数名称:start_task(void *pdata) 118 * 函数功能:开始任务 119 * 输入参数:*pdata 120 * 输出参数:无 121 * 函数说明:无 122 * 123 **********************************************************/ 124 void start_task(void *pdata) 125 { 126 OS_CPU_SR cpu_sr=0; 127 128 pdata=pdata;//防止编译器报错 129 130 OSStatInit();//初始化统计任务 131 132 OS_ENTER_CRITICAL();//进入临界区,中断无法打断 133 134 /*创建任务*/ 135 /*LED1任务*/ 136 OSTaskCreate( 137 led1_task, //指向任务代码的指针 138 (void *)0, //任务开始执行时,传递给任务参数的指针 139 (OS_STK *) & LED1_TASK_STK[LED1_STK_SIZE-1],//分配给任务堆栈的栈顶指针 140 LED1_TASK_PRIO//分配给任务的优先级 141 ); 142 /*LED2任务*/ 143 OSTaskCreate( 144 led2_task, //指向任务代码的指针 145 (void *)0, //任务开始执行时,传递给任务参数的指针 146 (OS_STK *) & LED2_TASK_STK[LED2_STK_SIZE-1],//分配给任务堆栈的栈顶指针 147 LED2_TASK_PRIO//分配给任务的优先级 148 ); 149 /*LED3任务*/ 150 OSTaskCreate( 151 led3_task, //指向任务代码的指针 152 (void *)0, //任务开始执行时,传递给任务参数的指针 153 (OS_STK *) & LED3_TASK_STK[LED3_STK_SIZE-1],//分配给任务堆栈的栈顶指针 154 LED3_TASK_PRIO//分配给任务的优先级 155 ); 156 157 OSTaskSuspend(START_TASK_PRIO);//挂起开始任务 158 159 OS_EXIT_CRITICAL();//退出临界区,可以被中断打断 160 161 }
1 /***************************************************************************************************************************** 2 * 3 * 文件名称:pbdata.c 4 * 文件功能:自定义函数 5 * 文件说明:无 6 * 7 *****************************************************************************************************************************/ 8 9 10 11 #include "pbdata.h" 12 13 u8 dt=0; 14 static u8 fac_us=0;//us延时倍乘数 15 static u16 fac_ms=0;//ms延时倍乘数 16 17 18 19 /********************************************************** 20 * 21 * 函数名称:Delay_Init(void) 22 * 函数功能:初始化延时函数 23 * 输入参数:无 24 * 输出参数:无 25 * 函数说明:当使用ucos的时候,此函数会初始化ucos的时钟节拍 26 * SYSTICK的时钟固定为HCLK时钟的1/8 27 * SYSCLK:系统时钟 28 * 29 **********************************************************/ 30 void Delay_Init(void) 31 { 32 u32 reload; 33 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟,HCLK/8 34 fac_us=SystemCoreClock/8000000; //为系统时钟的1/8 35 36 reload=SystemCoreClock/8000000; //每秒钟的计数次数,单位为K 37 reload*=1000000/OS_TICKS_PER_SEC;//根据OS_TICKS_PER_SEC设定溢出事件,reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右 38 39 fac_ms=1000/OS_TICKS_PER_SEC;// 代表ucos可以延时的最少单位 40 SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启SYSTICK中断 41 SysTick->LOAD=reload; //每1/OS_TICKS_PER_SEC秒中断一次 42 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK 43 } 44 45 46 47 48 49 /********************************************************** 50 * 51 * 函数名称:delay_us(u32 nus) 52 * 函数功能:延时微秒子程序 53 * 输入参数:nus, 延时微秒数 54 * 输出参数:无 55 * 函数说明:无 56 * 57 **********************************************************/ 58 void delay_us(u32 nus) 59 { 60 u32 ticks; 61 u32 told,tnow,tcnt=0; 62 u32 reload=SysTick->LOAD; //LOAD的值 63 ticks=nus*fac_us; //需要的节拍数 64 tcnt=0; 65 told=SysTick->VAL; //刚进入时的计数器值 66 while(1) 67 { 68 tnow=SysTick->VAL; 69 if(tnow!=told) 70 { 71 if(tnow<told)tcnt+=told-tnow;//这里注意一下SYSTICK是一个递减的计数器就可以了 72 else tcnt+=reload-tnow+told; 73 told=tnow; 74 if(tcnt>=ticks)break;//时间超过/等于要延时的事件,则退出 75 } 76 }; 77 } 78 79 80 81 82 83 84 /********************************************************** 85 * 86 * 函数名称:delay_ms(u16 nms) 87 * 函数功能:延时毫秒子程序 88 * 输入参数:nms, 延时微秒数 89 * 输出参数:无 90 * 函数说明:无 91 * 92 **********************************************************/ 93 void delay_ms(u16 nms) 94 { 95 if(OSRunning==TRUE)//如果os已经在跑了 96 { 97 if(nms>=fac_ms)//延时的事件大于ucos的最少时间周期 98 { 99 OSTimeDly(nms/fac_ms);//ucos延时 100 } 101 nms%=fac_ms; //ucos已经无法提供这么小的延时了,采用普通方式延时 102 } 103 delay_us((u32)(nms*1000)); //普通方式延时,此时ucos无法启动调度 104 } 105 106 107 108 109 /********************************************************** 110 * 111 * 函数名称:delay(u32 nCount) 112 * 函数功能:普通不精确延时 113 * 输入参数:nCount, 延时时间长短 114 * 输出参数:无 115 * 函数说明:无 116 * 117 **********************************************************/ 118 void delay(u32 nCount) 119 { 120 for(;nCount!=0;nCount--); 121 }
1 /***************************************************************************************************************************** 2 * 3 * 文件名称:pbdata.h 4 * 文件功能:自定义函数的头文件声明 5 * 文件说明:无 6 * 7 *****************************************************************************************************************************/ 8 9 10 #ifndef _pbdata_H 11 #define _pbdata_H 12 13 14 15 16 17 18 /********************************************************** 19 * 20 * 需要引入的头文件 21 * 22 **********************************************************/ 23 #include "stm32f10x.h" 24 #include "includes.h" 25 #include "misc.h" 26 27 #include "led.h"//LED相关头文件 28 29 30 31 /********************************************************** 32 * 33 * 子函数程序声明 34 * 35 **********************************************************/ 36 void delay(u32 nCount);//普通不精确延时 37 void Delay_Init(void);//延时函数初始化 38 void delay_us(u32 nus);//微秒延时 39 void delay_ms(u16 nms);//毫秒延时 40 41 42 43 #endif
1 /***************************************************************************************************************************** 2 * 3 * 文件名称:stm32f10x_it.c 4 * 文件功能:中断处理函数 5 * 文件说明:无 6 * 7 *****************************************************************************************************************************/ 8 #include "stm32f10x_it.h" 9 #include "pbdata.h" 10 11 12 13 14 15 16 17 18 19 /********************************************************** 20 * 21 * 函数名称:NMI_Handler(void) 22 * 函数功能:NMI中断处理函数 23 * 输入参数:无 24 * 输出参数:无 25 * 函数说明:无 26 * 27 **********************************************************/ 28 void NMI_Handler(void) 29 { 30 } 31 32 33 34 35 36 37 38 /********************************************************** 39 * 40 * 函数名称:USART1_IRQHandler(void) 41 * 函数功能:USART1中断处理函数 42 * 输入参数:无 43 * 输出参数:无 44 * 函数说明:无 45 * 46 **********************************************************/ 47 void USART1_IRQHandler(void) 48 { 49 while(1); 50 } 51 52 53 54 55 /********************************************************** 56 * 57 * 函数名称:HardFault_Handler(void) 58 * 函数功能:UHardFault中断处理函数 59 * 输入参数:无 60 * 输出参数:无 61 * 函数说明:无 62 * 63 **********************************************************/ 64 void HardFault_Handler(void) 65 { 66 /* Go to infinite loop when Hard Fault exception occurs */ 67 while (1) 68 { 69 } 70 } 71 72 73 74 75 76 77 78 /********************************************************** 79 * 80 * 函数名称:MemManage_Handler(void) 81 * 函数功能:MemManage中断处理函数 82 * 输入参数:无 83 * 输出参数:无 84 * 函数说明:This function handles Memory Manage exception. 85 * 86 **********************************************************/ 87 void MemManage_Handler(void) 88 { 89 /* Go to infinite loop when Memory Manage exception occurs */ 90 while (1) 91 { 92 } 93 } 94 95 96 97 98 99 100 /********************************************************** 101 * 102 * 函数名称:BusFault_Handler(void) 103 * 函数功能:BusFault中断处理函数 104 * 输入参数:无 105 * 输出参数:无 106 * 函数说明:This function handles Bus Fault exception. 107 * 108 **********************************************************/ 109 void BusFault_Handler(void) 110 { 111 /* Go to infinite loop when Bus Fault exception occurs */ 112 while (1) 113 { 114 } 115 } 116 117 118 119 120 121 /********************************************************** 122 * 123 * 函数名称:UsageFault_Handler(void) 124 * 函数功能:UsageFault中断处理函数 125 * 输入参数:无 126 * 输出参数:无 127 * 函数说明:This function handles Usage Fault exception. 128 * 129 **********************************************************/ 130 void UsageFault_Handler(void) 131 { 132 /* Go to infinite loop when Usage Fault exception occurs */ 133 while (1) 134 { 135 } 136 } 137 138 139 140 141 142 /********************************************************** 143 * 144 * 函数名称:SVC_Handler(void) 145 * 函数功能:SVC中断处理函数 146 * 输入参数:无 147 * 输出参数:无 148 * 函数说明:This function handles SVCall exception. 149 * 150 **********************************************************/ 151 void SVC_Handler(void) 152 { 153 } 154 155 156 157 158 /********************************************************** 159 * 160 * 函数名称:DebugMon_Handler(void) 161 * 函数功能:DebugMon中断处理函数 162 * 输入参数:无 163 * 输出参数:无 164 * 函数说明:This function handles Debug Monitor exception. 165 * 166 **********************************************************/ 167 void DebugMon_Handler(void) 168 { 169 } 170 171 172 173 174 175 176 177 /********************************************************** 178 * 179 * 函数名称:SysTick_Handler(void) 180 * 函数功能:SysTick中断处理函数 181 * 输入参数:无 182 * 输出参数:无 183 * 函数说明:This function handles SysTick Handler. 184 * 185 **********************************************************/ 186 void SysTick_Handler(void) 187 { 188 OSIntEnter(); //进入中断 189 OSTimeTick(); //调用ucos的时钟服务程序 190 OSIntExit(); //触发任务切换软中断 191 } 192 193 194 195 196 197 198 /********************************************************** 199 * 200 * 函数名称:EXTI9_5_IRQHandler(void) 201 * 函数功能:EXTI9_5中断处理函数 202 * 输入参数:无 203 * 输出参数:无 204 * 函数说明:无 205 * 206 **********************************************************/ 207 void EXTI9_5_IRQHandler(void) 208 { 209 210 } 211 212 213 214 215 216 217 /********************************************************** 218 * 219 * 函数名称:EXTI1_IRQHandler(void) 220 * 函数功能:EXTI1中断处理函数 221 * 输入参数:无 222 * 输出参数:无 223 * 函数说明:无 224 * 225 **********************************************************/ 226 void EXTI1_IRQHandler(void) 227 { 228 229 } 230 231 232 233 234 235 236 237 /********************************************************** 238 * 239 * 函数名称:EXTI2_IRQHandler(void) 240 * 函数功能:EXTI2_中断处理函数 241 * 输入参数:无 242 * 输出参数:无 243 * 函数说明:无 244 * 245 **********************************************************/ 246 void EXTI2_IRQHandler(void) 247 { 248 249 } 250 251 252 253 254 255 256 257 258 /********************************************************** 259 * 260 * 函数名称:EXTI3_IRQHandler(void) 261 * 函数功能:EXTI3_中断处理函数 262 * 输入参数:无 263 * 输出参数:无 264 * 函数说明:无 265 * 266 **********************************************************/ 267 void EXTI3_IRQHandler(void) 268 { 269 270 }
1 /***************************************************************************************************************************** 2 * 3 * 文件名称:led.c 4 * 文件功能:led相关函数 5 * 文件说明:无 6 * 7 *****************************************************************************************************************************/ 8 9 10 11 12 #include "pbdata.h" 13 14 15 16 /********************************************************** 17 * 18 * 函数名称:LED_GPIO(void) 19 * 函数功能:LED的GPIO配置 20 * 输入参数:无 21 * 输出参数:无 22 * 函数说明:无 23 * 24 **********************************************************/ 25 26 void LED_GPIO(void)//GPIO初始化函数 27 { 28 GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO设置的结构体变量 29 30 /*LED1配置*/ 31 /*结构体变量赋值*/ 32 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;////引脚配置 33 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置频率 34 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出 35 /*对应的GPIO初始化*/ 36 GPIO_Init(GPIOB,&GPIO_InitStructure); 37 38 /*LED2、LED3配置*/ 39 /*结构体变量赋值*/ 40 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3 | GPIO_Pin_6;////LED2、LED3引脚配置 41 /*对应的GPIO初始化*/ 42 GPIO_Init(GPIOD,&GPIO_InitStructure); 43 44 45 } 46 47 48 49 50 51 52 53 /********************************************************** 54 * 55 * 函数名称:led1_task(void *pdata) 56 * 函数功能:led1任务处理函数 57 * 输入参数:*pdata 58 * 输出参数:无 59 * 函数说明:无 60 * 61 **********************************************************/ 62 63 void led1_task(void *pdata) 64 { 65 pdata=pdata;//防止编译器报错 66 67 while(1) 68 { 69 GPIO_SetBits(GPIOB,GPIO_Pin_5);//指定端口设置为高电平 70 71 delay_ms(1000);//1s,delay,公共函数库中自己定义 72 73 GPIO_ResetBits(GPIOB,GPIO_Pin_5);//指定端口设置低电平 74 75 delay_ms(1000);//1s,delay,公共函数库中自己定义 76 } 77 78 } 79 80 81 82 83 84 /********************************************************** 85 * 86 * 函数名称:led2_task(void *pdata) 87 * 函数功能:led2任务处理函数 88 * 输入参数:*pdata 89 * 输出参数:无 90 * 函数说明:无 91 * 92 **********************************************************/ 93 94 void led2_task(void *pdata) 95 { 96 pdata=pdata;//防止编译器报错 97 98 while(1) 99 { 100 GPIO_SetBits(GPIOD,GPIO_Pin_6);//指定端口设置为高电平 101 102 delay_ms(1000);//1s,delay,公共函数库中自己定义 103 104 GPIO_ResetBits(GPIOD,GPIO_Pin_6);//指定端口设置低电平 105 106 delay_ms(1000);//1s,delay,公共函数库中自己定义 107 } 108 109 } 110 111 112 113 114 /********************************************************** 115 * 116 * 函数名称:led3_task(void *pdata) 117 * 函数功能:led3任务处理函数 118 * 输入参数:*pdata 119 * 输出参数:无 120 * 函数说明:无 121 * 122 **********************************************************/ 123 124 void led3_task(void *pdata) 125 { 126 pdata=pdata;//防止编译器报错 127 128 while(1) 129 { 130 GPIO_SetBits(GPIOD,GPIO_Pin_3);//指定端口设置为高电平 131 132 delay_ms(1000);//1s,delay,公共函数库中自己定义 133 134 GPIO_ResetBits(GPIOD,GPIO_Pin_3);//指定端口设置低电平 135 136 delay_ms(1000);//1s,delay,公共函数库中自己定义 137 } 138 139 }
1 /***************************************************************************************************************************** 2 * 3 * 文件名称:led.h 4 * 文件功能:led相关函数的头文件 5 * 文件说明:无 6 * 7 *****************************************************************************************************************************/ 8 9 10 #ifndef _LED_H 11 #define _LED_H 12 13 #include "pbdata.h" 14 15 16 void LED_GPIO(void);//LED的GIPO引脚配置 17 18 void led1_task(void *pdata);//LED1任务 19 void led2_task(void *pdata);//LED2任务 20 void led3_task(void *pdata);//LED3任务 21 22 23 24 #endif
2、工程下载:
http://download.csdn.net/detail/a1181803348/8828991