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

时间: 2024-10-23 13:30:01

4、创建一个任务,点亮LED的相关文章

3.修改第一个程序来点亮LED

在上一节中已经将驱动程序框架搭建好了 接下来开始写硬件的操作(控制LED): (1)看原理图,确定引脚 (2)看2440手册 (3)写代码(需要使用ioremap()函数映射虚拟地址,在linux中只能使用虚拟地址) (4)修改上一节的测试程序 (5)使用次设备号来控制设备下不同的灯 1.看led引脚 最终确定: LED1 ->GPF4  LED2 ->GPF5   LED3 ->GPF6 2.看2440手册 配置GPFCON[15:0](0x56000050)的位[8:9].位[10:

Ros使用Arduino 3用rosserial创建一个subscriber

在前面的一节中,我们已经使用arduino创建了一个publisher节点,接下来将会用arduino来创建一个subscriber,接收电脑传去的信息并做出相应的反应. 1启动Arduino 将arduino开发板连接到电脑的usb口,在arduino IDE中进行设置. 选择Tools->Board,选择你所使用的arduino开发板的类型,所使用的arduino开发板是arduino pro min. 设置好开发板之后,继续选择Tools->Serial Port->/dev/tt

TQ2440按键点亮LED驱动程序

一,硬件分析: 1.打开TQ2440的底板原理图找到按键测试的模块,如下图所示: 从图我们知道,控制按键k1 k2 k3 k4 的管脚为EINT1 EINT4 EINT2 EINT0 ,当按键按下时,管脚输出低电平,当按键没有被按下时,管脚输出高电平. 2.打开TQ2440核心板原理图找到EINT1  EINT4 EINT2 EINT0所对应的cpu控制引脚,如下图所示: 从图我们可以知道,EINT1  EINT4 EINT2 EINT0 对应的cpu控制引脚为GPF1 GPF4 GPF2 GP

liunx驱动----点亮LED

自动挂接根文件系统(直接从NFS启动) 修改uboot命令行 把 bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 改为: set bootarges noinitrd root=/dev/nfs nfsroot=192.168.0.104:/home/book/work/nfs_root/first_fs ip=192.168.0.10:192.168.0.104:192.168.0.1:255

嵌入式学习笔记002-点亮led

正如编写第一个程序所打印"hello world"那样,对TQ2440开发板的初次使用也是从最简单的部分入手,点亮led灯无疑是最简单的,起码只要设置几个寄存器就好,比起打印容易得多了,后续会讲到串口部分再来实现我们这句金典的对白~~~~ 板子共有4个led灯,如果能够成功点亮其中一个,那么其他几个将不是问题,故而我们的目标是先点亮第一个先,在此我们必须理清几个问题: a. led的引脚连接的相关寄存器 b. 编写的语言 c. 用什么来编译链接成可执行文件 d. 怎么download到

Android下创建一个输入法

输入法是一种可以让用户输入文字的控件.Android提供了一套可扩展的输入法框架,使得应用程序可以让用户选择各种类型的输入法,比如基于触屏的键盘输入或者基于语音.当安装了特定输入法之后,用户即可在系统设置中选择个输入法,并在接下来的输入场景中使用该输入法.不过在任一时刻,只能使用一个输入法. 为了在安卓系统下创建一个输入法,需要新建一个包含扩展了InputMethodService类的安卓应用,并创建一个用于设置的activity,用户可以通过它将设置选项传给输入法的service,因此,你还需

STM32F407第一步之点亮LED

STM32F407第一步之点亮LED. 要点亮LED,首先了解一下F4的GPIO模块.首先看一下STM32F4数据手册,GPIO模块的内部结构图 看上去有点复杂,不要怕,慢慢理解就可以了.对外引脚那里二极管就是保护的作用.通过上.下拉对应的开关配置,控制引脚默认状态的电压,开启上拉的时候引脚电压为高电平,开启下拉的时候引脚电压为低电平,这样可以消除引脚不定状态的影响.但是这个不应该用来作为外部的上拉或下拉用,如按键的拉电阻不能用这个内部来作用,如果用可能会引起按键不稳定. GPIO 具有了“推挽

用STC12C5A60S2的P4接口点亮LED

STC12C5A60S2管脚 使用的开发板 程序代码 /* 工程创建MCU选取,Atmel 89C55 单片机:STC12C5A60S2 晶振:12M 功能:用STC12C5A60S2的P4接口点亮LED 连接说明:LED正极接VCC,负极接到 MCU的9,29,30,31脚 */ #include <STC12C5A60S2.H>  sbit LED7=P4^7; sbit LED6=P4^6; sbit LED5=P4^5; sbit LED4=P4^4; void DELAY_MS (u

用WidgeDuino创建一个SCADA(监控与数据采集)系统

WidgeDuino – 最近在Kickstarter上亮相 – 是一个智能的易配置的窗口- 基于Microsoft Windows平台和基于像 Atmel-based Arduino board 的微控制器系统通讯应用. 实质上, WidgeDuino 通过串口协议或者 TCP/IP 与微控制器系统通讯. "这包括, 除其他外, 键盘, LED灯, 压力表, 旋钮, 滑块, 温度计, 容器及按钮. 其直观方法是,通讯简化了快速原型和完整的自动化系统发展." 更准确的说, Widged

TQ2440按键点亮LED灯的裸机程序

一,说到做ARM的裸机程序,很多人马上就会联想到一个名为ADS的开发工具,但是我们在linux下同样也可以做ARM的裸机程序,下面来说说其具体实施过程: 步骤一:编辑代码,这个没什么好说的. 步骤二:编译代码,编译代码分为三个方面的内容:1.链接脚本 2.用命令行确定链接时的文件顺序 3.用命令行编译.这三部分的内容可以全部写成一个Makefile文件,编译的时候执行make命令就可以了. 步骤三:把编译后的".bin"文件烧写进开发板,重新上电观察效果. 二,TQ2440按键点亮LE