4、创建一个任务,点亮LED
1、程序例程代码
1 /***************************************************************************************************************************** 2 * 3 * 文件名称:main.c 4 * 文件功能:主函数 5 * 文件说明:无 6 * 7 *****************************************************************************************************************************/ 8 /********************************************************** 9 * 10 * 头文件声明 11 * 12 **********************************************************/ 13 #include "stm32f10x.h" 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 36 37 38 39 40 /********************************************************** 41 * 42 * 调用函数声明 43 * 44 **********************************************************/ 45 void RCC_Configuration(void);//时钟配置函数 46 47 void start_task(void *pdata);//开始任务函数 48 49 void led1_task(void *pdata);//led1任务函数 50 51 52 53 54 55 56 57 58 /********************************************************** 59 * 60 * 主函数 61 * 62 **********************************************************/ 63 int main(void) 64 { 65 Delay_Init();//延时函数初始化 66 67 RCC_Configuration();//时钟配置 68 69 LED_GPIO();//LED的GPIO引脚配置 70 71 72 /*操作系统的处理*/ 73 OSInit();//初始化UCOS操作系统 74 OSTaskCreate( 75 start_task, //指向任务代码的指针 76 (void *)0, //任务开始执行时,传递给任务参数的指针 77 (OS_STK *) & START_TASK_STK[START_STK_SIZE-1],//分配给任务堆栈的栈顶指针 78 START_TASK_PRIO//分配给任务的优先级 79 ); 80 OSStart();//启动OS操作系统 81 82 83 84 85 } 86 87 88 89 /********************************************************** 90 * 91 * 函数名称:RCC_Configuration(void) 92 * 函数功能:时钟配置 93 * 输入参数:无 94 * 输出参数:无 95 * 函数说明:无 96 * 97 **********************************************************/ 98 void RCC_Configuration(void) 99 { 100 SystemInit();//系统初始化 101 102 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//LED对应GPIO时钟使能 103 } 104 105 106 107 108 109 110 /********************************************************** 111 * 112 * 函数名称:start_task(void *pdata) 113 * 函数功能:开始任务 114 * 输入参数:*pdata 115 * 输出参数:无 116 * 函数说明:无 117 * 118 **********************************************************/ 119 void start_task(void *pdata) 120 { 121 OS_CPU_SR cpu_sr=0; 122 123 pdata=pdata;//防止编译器报错 124 125 OSStatInit();//初始化统计任务 126 127 OS_ENTER_CRITICAL();//进入临界区,中断无法打断 128 129 OSTaskCreate( 130 led1_task, //指向任务代码的指针 131 (void *)0, //任务开始执行时,传递给任务参数的指针 132 (OS_STK *) & LED1_TASK_STK[LED1_STK_SIZE-1],//分配给任务堆栈的栈顶指针 133 LED1_TASK_PRIO//分配给任务的优先级 134 ); 135 136 OSTaskSuspend(START_TASK_PRIO);//挂起开始任务 137 138 OS_EXIT_CRITICAL();//退出临界区,可以被中断打断 139 140 } 141 142 143 144 145 146 147 /********************************************************** 148 * 149 * 函数名称:led1_task(void *pdata) 150 * 函数功能:led1任务处理函数 151 * 输入参数:*pdata 152 * 输出参数:无 153 * 函数说明:无 154 * 155 **********************************************************/ 156 157 void led1_task(void *pdata) 158 { 159 pdata=pdata;//防止编译器报错 160 161 while(1) 162 { 163 GPIO_SetBits(GPIOB,GPIO_Pin_5);//指定端口设置为高电平 164 165 delay_ms(1000);//1s,delay,公共函数库中自己定义 166 167 GPIO_ResetBits(GPIOB,GPIO_Pin_5);//指定端口设置低电平 168 169 delay_ms(1000);//1s,delay,公共函数库中自己定义 170 } 171 172 }
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 /*结构体变量赋值*/ 31 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;////引脚配置 32 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置频率 33 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出 34 35 /*对应的GPIO初始化*/ 36 GPIO_Init(GPIOB,&GPIO_InitStructure); 37 }
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 19 20 21 22 23 24 #endif
2、工程下载:
http://download.csdn.net/detail/a1181803348/8828877