自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 STM32实验4:按键中断

端口配置#include "stm32f10x.h"//PA13 PA15void KEY_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2Pe

2017-03-19 21:23:01 2349

原创 STM32实验2:IO输入

端口初始化#include "stm32f10x.h"//PA15void KEY_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能外设置时钟 GPIO_InitStructure.GPIO_Pin = G

2017-03-19 20:35:38 969

转载 STM32实验1:IO输出

LED控制端口初始化//初始化PA8和PD2为输出口.并使能这两个口的时钟 //LED IO初始化void LED_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能APB2外设时钟 GPIO_I

2017-03-19 00:33:36 1033

转载 STM32的时钟系统

要点 1.STM32有4个时钟源: 1)高速外部时钟(HSE),晶振可取范围为4M-16M 2)高速内部时钟(HSI),由内部RC振荡器产生,频率为8M,但不稳定。 3)低速外部时钟(LSE):主要提供给实时时钟模块,一般采用32.768kHz。 4)低速内部时钟(LSI):由内部RC振荡器产生,也主要提供给实时时钟模块,频率大约为40kHz。 2.与开发密切相关的时钟 1)SYSCL

2017-03-18 20:19:39 562

原创 uc/os-ii 实验6:消息邮箱(2)

开发板:正电原子STM32F103 MINI 实现功能:实现消息邮箱群发现象 要点:了解消息邮箱广播相关操作,OSMboxPostOpt函数的第三个参数opt,当为OS_POST_OPT_NONE时,则把消息只向优先级别最高的等待任务发送,当为OS_POST_OPT_BROADCAST时,把消息向所有等待任务广播。 代码如下:#include "sys.h"#include "usart

2017-03-17 23:22:49 885

原创 uc/os-ii 实验5:信号邮箱(1)

开发板:正电原子STM32F103 MINI 实现功能:使用消息邮箱使LED灯闪烁 要点:了解互斥信号量的相关操作 代码如下#include "sys.h"#include "usart.h" #include "delay.h" #include "led.h" #include "key.h" #include "includes.h" //功能:消息邮

2017-03-17 22:45:15 609

原创 uc/os-ii 实验4:互斥信号量

开发板:正电原子STM32F103 MINI 实现功能:模拟优先级反转现象 要点:了解互斥信号量的相关操作,互斥型信号量所对应的事件控制块中成员变量OSEventCnt的高8位为要提升的优先级,低8位赋予OS_MUTEX_AVAILABLE,需要注意的是OS_MUTEX_AVAILABLE不一定是0XFF,但是创建二值信号时这个值必须为0XFF否则创建不成功,当任务成功创建互斥信号量后OS_

2017-03-17 21:24:10 990

原创 uc/os-ii 实验3:优先级反转

开发板:正电原子STM32F103 MINI 实现功能:模拟优先级反转现象 要点:使用信号量的任务是否能够运行是受任务的优先级以及是否占用信号量两个条件约束的,而信号量的约束高于优先级别的约束。于是当出现低优先级别的任务和高优先级别的任务使用同一个信号量,而系统中还存在其他中等优先级别的任务时,如果低优先级别的任务先获得了信号量,就会使高优先级别的任务处于等待状态,而那些不使用该信号量的中等优

2017-03-14 21:32:22 1106

原创 uc/os-ii 实验2:信号量

功能说明:LED交替闪烁 实验要点:信号量的发送与请求 代码如下:#include "sys.h"#include "usart.h" #include "delay.h" #include "led.h" #include "key.h" #include "includes.h" //功能:LED交替亮灭//设置任务堆栈大小#define LED_STK

2017-03-14 00:59:01 816

原创 uc/os-ii实验1:信号量

ucos-ii实验1:信号量开发板:正电原子STM32F103 MINI 实现功能:通过按键控制LED灯亮灭 要点:信号量的请求与发送代码如下:#include "sys.h"#include "usart.h" #include "delay.h" #include "led.h" #include "key.h" #include "includes.h"

2017-03-14 00:40:15 893

转载 伪指令IRP和IRPC

伪指令IRP和IRPC伪指令IRP 伪指令IRP的作用是用每个参数创建一组语句,其重复次数由伪指令后面参数表中参数的个数来确定。其一般使用格式如下: IRP形式参数, <实参1, 实参2, ……, 实参n> 重复的语句组 ENDM 例9.11 把16位通用寄存器之值相加,并把结果存入寄存器AX。 解:由于16位通用寄存器名是一些不同的符号,不能用计数的方法来依次访问它们,所以,我们需要用

2016-01-08 11:11:00 1228

转载 ?C_XBP解析

首先在startup.a51中找到如下语句: IF XBPSTACK <> 0 EXTRN DATA (?C_XBP) MOV ?C_XBP,#HIGH XBPSTACKTOP MOV ?C_XBP+1,#LOW XBPSTACKTOP ENDIF 从前面的定义知道XBPSTACK定义为1,因此此处将首先对C

2016-01-08 10:41:48 846

原创 结构体与指针

结构体与指针例程1typedef struct{ unsigned int a; unsigned int b; unsigned int c;}Test_T;void main(void){ Test_T Temp; Test_T *Test;//指向数组的指针 Test=&Temp; Temp.a=0; Temp.b=1;

2016-01-07 11:37:42 483

转载 UC/OS-II基础知识之信号量及其操作

UC/OS-II基础知识之信号量及其操作1.信号量 当事件控制块成员OSEventType的值被设置成OS_EVENT_TYPE_SEM时,这个事件控制块描述的就是一个信号量,信号量由信号量计数器和等待任务表两部分组成,信号量使用事件控制块的成员OSEventCnt作为计数器,而用数组OSEventTbl【】来充当等待任务表。每当有任务申请信号量时,如果信号量计数器OSEventCnt的值大于0,

2016-01-07 10:28:49 1726

转载 UC/OS-II基础知识之事件控制块及事件处理函数

UC/OS-II基础知识之事件控制块及事件处理函数1.等待任务列表 作为功能完善的事件,应该对那些处于等待任务具有两方面的管理功能,一是要对等待事件的所有任务进行记录并排序,而是允许等待任务有一个等待时限,即当等待任务认为等不及时可以退出对事件的请求。对于等待事件任务的记录,系统使用了与任务就绪表类似的位图,即定义了一个INT8U类型的数组OSEventTbl【】作为等待事件任务的记录表,即等待任

2016-01-06 22:05:31 2564

转载 UC/OS-II基础知识之任务的同步与事件

UC/OS-II基础知识之任务的同步与事件为了实现各个任务之间的合作和无冲突的运行,在各任务之间必须建立起一些制约制约关系,UC/OS-II有两种制约关系,间接制约和直接制约。直接制约关系来源于任务间的合作,间接制约关系源于对资源的共享, 1.事件 UC/OS-II使用信号量,邮箱(消息邮箱)和消息队列这些中间环节来实现任务间的通信,为了方便起见,这些中间环节都统称为事件。两个任务通过事件进行通

2016-01-06 21:06:24 1440

转载 UC/OS基础知识之时间管理

UC/OS-II基础知识之时间管理1.任务的延时 由于嵌入式系统的任务是一个无限循环,并且UC/OS-II还是个抢占式内核,所以为了使优先级别高的任务不至于独占CPU,UC/OS-II规定:除了空闲任务之外的所有任务必须在任务中合适的位置调用系统提供的函数OSTimeDly(),使当前任务的运行延时(暂停)一段时间并进行一次任务调度,以让出CPU的使用权。 函数OSTimeDly()的代码如下

2016-01-06 17:46:10 526

转载 UC/OS-II基础知识之时钟

UC/OS-II基础知识之时钟与大多数计算机系统一样,UC/OS-II用硬件定时器产生一个毫秒级的周期性中断来实现系统时钟,最小的时钟单位就是两次中断之间的间隔时间,这个最小时钟单位就叫做时钟节拍。硬件定时器以时钟节拍为周期定时的产生中断,该中断的中断服务程序叫做OSTickISR(),中断服务程序通过调用函数OSTimeTick()来完成系统在每个时钟节拍时需要做的工作。OSTickISR()是用

2016-01-06 17:21:22 1035

转载 UC/OS-II基础知识之中断

UC/OS-II基础知识之中断1.中断 任务在运行过程中,应内部或者外部异步事件的请求终止当前任务而去处理异步时间所要求的任务的过程叫做中断,应中断请求而运行的程序叫做中断服务子程序,中断服务子程序的入口地址叫做中断向量。UC/OS-II系统响应中断的过程是:系统接收到中断请求时,如果这时CPU处于中断允许状态,即中断时开放的,系统就会终止正在运行的当前任务,而按照中断向量的指向转而去运行服务子程

2016-01-06 16:19:54 2965

转载 UC/OS-II基础知识之系统的初始化

UC/OS-II基础知识之系统的初始化1.UC/OS-II的初始化 在使用UC/OS-II的所有服务之前,必须调用UC/OS-II的初始化函数OSInit()来对UC/OS-II的运行环境进行初始化。OSInit()将对UC/OS-II的所有全局变量和数据结构进行初始化,同时创建空闲任务OSTaskIdle,并赋之以最低的优先级别和永远的就绪状态,如果用户还使能了通缉任务,系统还要创建统计任务。初

2016-01-06 15:20:54 1052

转载 UC/OS基础知识之任务的删除

UC/OS基础知识之任务的删除所谓的删除一个任务,就是把任务处于睡眠状态。具体状态就是把删除的任务从任务控制块链表中山删除,并归还给空任务控制块链表,然后在任务就绪表中把该任务的状态位置0,于是该任务就不能被调度器所调用了。在任务中可以调用函数OSTaskDel()来删除空闲任务以外的任务。#if OS_TASK_DEL_EN > 0INT8U OSTaskDel (INT8U prio){

2016-01-06 14:58:16 1093

转载 摄像头引脚定义

摄像头引脚定义1 NC NO CONNECT 2 AGND Power Analog ground 3 SIO_D I/O SCCB serial interface data I/O 4 AVDD Power Analog power supply (VDD-A= 2.45 to 2.8 VDC) 5 SIO_C Input SCCB serial interface clock

2016-01-06 13:53:08 6922

转载 UC/OS基础知识之任务的挂起和恢复

UC/OS基础知识之任务的挂起和恢复所谓挂起就是停止这个任务的运行。用户可以通过调用系统提供的OSTaskSuspend()函数来挂起除空闲任务之外的其他任务,只能在其他任务中调用恢复函数OSTaskResume()使其恢复为就绪状态。任务在运行,就绪状态和等待状态之间的转移关系如下图 1.任务的挂起 挂起任务函数OSTaskSuspend()如下所示#if OS_TASK_SUSPEND_

2016-01-05 22:56:09 1011

转载 UC/OS基础知识之任务的创建

任务的创建1.创建任务函数 任务的创建实质上是创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务。UC/OS提供两个函数创建任务OSTaskCreate()和OSTaskCreateExt()。一般前者用的多,OSTaskCreate()如下所示:INT8U OSTaskCreate (void (*task)(void *p_arg), void *p_arg,

2016-01-05 22:02:50 769

转载 UC/OS基础知识之任务就绪表

UC/OS基础知识之任务就绪表1.任务就绪表 系统总是从处于就绪状态的任务中选择任务运行,为此系统需要一个就绪任务登记表,它登记了系统中所有处于就绪状态的任务,在UC/OS中这个就绪表就是一个位图,系统中的每个任务都在这个位图中占据一个进制位,该位值得状态(1或者0)表示该任务是否处于就绪状态。 其示意图如下图所示: OSRdyTbl[]数组的一个元素代表8个任务的就绪状态,一个元素构

2016-01-05 14:55:31 1561

转载 UC/OS基础知识之任务控制块

UC/OS基础知识之任务控制块1.任务控制块结构 用来记录任务的堆栈指针,任务的当前状态,任务的优先级别等一些与任务管理有关的属性的表就叫做任务控制块,没有任务控制块的任务不能被系统承认和管理 任务控制块是一个结构类型数据,当调用OSTaskCreate()创建任务时,该函数就会对任务控制块中的所有成员赋值,并驻留在RAM中。任务控制块结构的定义如下typedef struct os_tcb {

2016-01-05 11:49:54 1949

转载 UC/OS基础知识之任务堆栈

UC/OS基础知识之任务堆栈1.任务堆栈 所谓堆栈就是在存储器中按数据“后进先出(LIFO)”的原则组织的连续存储空间,为了满足任务切换和响应中断时保存CPU寄存器中的内容及任务调用其他函数时的需要,每个任务都应该配有自己的堆栈。每个任务控制块都有一个指向该任务堆栈的指针。 PO:堆栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表。允许插入或删除操作的一端称为栈顶,另一端称为栈

2016-01-05 10:24:23 3334

转载 UC/OS基础知识之任务

UC/OS基础知识之任务(1)1.任务的组成 UC/OS操作系统内核的主要工作就是对任务进行管理和调度,任务由3部分组成:任务控制块,任务堆栈和任务程序代码。任务控制块就是关联了任务代码的程序控制块,记录了任务的各个属性;任务堆栈则用来保存任务的工作环境;任务程序代码就是任务的执行部分。其结构示意图如下图所示: 2.任务的种类 UC/OS有两种任务:用户任务和系统任务。有应用程序设计者编写的任

2016-01-04 20:38:26 1431

原创 STM32位带操作举例

STM32位带操作举例int main(void){ GPIO_InitTypeDef GPIO_InitStruction; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStruction.GPIO_Pin=GPIO_Pin_8; GPIO_InitStruction.GPIO_

2016-01-03 23:13:44 1525

转载 STM32的位带操作

STM32的位带操作对于位带操作可以使用普通的加载/存储指令来对单一的比特进行读写,在CM3中,有两个区中实现了位带。其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围。这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把位带区中的每个比特膨胀成一个 32 位的字。即位带别名区中的4个字节对应位带区中的一位,当对位带别

2016-01-03 21:29:52 1118

转载 Keil调试局部变量显示"not in scope"的问题解决

Keil调试局部变量显示”not in scope”的问题解决在调试STM32的时候,查看变量值的时候,变量值总是显示”not in scope”,无法看到变量被赋的值。出现这种情况的原因是这个局部变量没被分配到内存,或者变量被编译器优化了。 解决方法:降低Keil的编译优化选项

2016-01-01 22:52:59 10031 2

原创 用指针对结构体操作

用指针对结构体操作#include "stdio.h"#include "math.h"typedef struct{ unsigned int a; unsigned int b; unsigned int c;}Test_T;void main(void){ while(1) { Test_T Temp; Tes

2015-12-31 10:17:15 682

转载 #if

#if当注释掉大块代码时,使用”#if 0”比使用”//”要好,因为用”//”做大段的注释要防止被注释掉的代码中有嵌套的”/**/”,这会导致注释掉的代码区域不是你想要的范围, 当被注释掉的代码很大时容易出现这种情况,特别是过一段时间后又修改该处代码时更是如此。 在这里顺便对条件编译(#ifdef, #else, #endif, #if等)进行说明。以下分3种情况:   1. 情况

2015-12-28 14:19:40 531

转载 ln ,lg,log在c语言中的表示

ln ,lg,log在c语言中的表示惊奇的发现:c语言中定义的函数和数学上定义的函数有所区别:c语言中只定义的两个函数: y=log (double x);和y=log10 (double x);前者代表数学式中的 ln,而后者表示数学式中的 lg,至于数学上要求loga(b)(a不为e和10),可用换底公式表示为log(b)/log(a)。要包含头文件math.h。 例子:求#include <

2015-12-28 14:16:33 41605

转载 指向函数的指针

指向函数的指针(一) 用函数指针变量调用函数   可以用指针变量指向整形变量、字符串、数组、结构体、也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。用简单的数值比较为例: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 {

2015-12-28 14:13:42 374

转载 C语言exp()函数

C语言exp()函数C语言exp()函数:e的次幂函数(以e为底的x次方值) 头文件:#include double exp(double x);【返回值】返回 e 的x 次方计算结果。

2015-12-28 14:07:51 18107

转载 指向结构体的指针

在C语言中几乎可以创建指向任何类型的指针,包括用户自定义的类型。创建结构体指针是极常见的。下面是一个例子:typedef struct{ char name[21]; char city[21]; char state[3];} Rec;typedef Rec *RecPointer;RecPointer r;r=(RecPointer)malloc(sizeof(R

2015-12-28 13:53:41 1136

转载 STM32的IO口基本操作

## STM32的IO口基本操作 ## void LED_GPIO_Config(void){ /*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure; /*开启GPIOC的外设时钟*/ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC,

2015-12-28 09:57:09 8625 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除