嵌入式总结

第一章

1嵌入式系统定义:以应用为中心、以计算机技术为基础、软件、硬件可裁剪、对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。

2四个基本要素:1 应用中心--“嵌入性” 2 软/硬件可裁剪3 专用性4 计算机系统

3一般有以下五个(四个)部分组成    硬件:1嵌入式微处理器2外围硬件设备 软件:3(驱动程序 )  4嵌入式操作系统 5应用程序

4嵌入式系统的特点:嵌入式系统一般是专用系统,而PC是通用计算平台

嵌入式系统的资源比PC少得多

嵌入式系统可靠性要求高,故障带来的后果比PC机大得多

嵌入式系统大都有成本、功耗、体积的要求

嵌入式系统使用的操作系统一般是适应多种处理器、可剪裁、轻量型、实时可靠、可固化的嵌入式操作系统

嵌入式系统开发需要专门工具和特殊方法

5分类:普林斯顿结构和哈佛结构     CISC和RISC     嵌入式系统内核种类

6 STM32:1、采用Cortex-M3的内核2、哈佛结构,数据总线与指令总线分开3、杰出的功耗控制:STM32经过特殊的处理,对应用中三种主要的功耗需求进行了优化:运行模式下高效率的动态耗电机制;待机时极低的电能消耗和电池供电时低电压工作能力4、创新设计:有两条外设总线,一条高速(APB2)达72Mhz,一条低速( APB1)达36Mhz。5、最大程度的集合:包含常用的大部分外设,如USB,CAN…6、易于开发:免费提供STM32固件库对C语言有良好的支持

7 开发方式:宿主机 开发机器(编辑器、编译器、调试器、….)  目标机程序运行的机器

宿主机和目标机一样时为本地编译      交叉编译是指宿主机和目标机是不同的系统

第三章

1嵌入式系统的最小系统是指以某控制器为核心,可以运行起来的最简单的硬件组成。

3    STM32主要包括电源电路,时钟电路,复位电路,启动电路和程序下载电路。

3 最小系统指ARM能够运行所需要的最基本的条件 包括:电源,时钟源,复位电路,调试接口,ARM处理器

4电压调节器的3种工作模式

运行模式:调节器以正常功耗模式提供1.8V电源(内核、内存和外设) 主模式

停止模式:调节器以低功耗模式提供1.8V电源,以保存寄存器和SRAM的内容  低功耗模式

待机模式:调节器停止供电。除了备用电路和备份域以外,寄存器和SRAM的内容全部丢失。 关断模式

5上电复位(POR)和掉电复位(PDR)  STM32内部有一个完整的上电复位(POR)和掉电复位(PDR)电路,当供电电压达到2V时系统就能正常工作。当VDD/VDDA低于指定的限位电压VPOR/PDR时,系统保持为复位状态,而无需外部复位电路。

6  STM32F10x系列处理器有3种低功耗模式:睡眠模式:Cortex-M3内核停止,外设仍在运行    停止模式:所有的时钟都已停止  待机模式:1.8V电源关闭    。此外,在运行模式下,还可以通过以下方式中的一种来降低功耗:1降低系统时钟 2关闭APB和AHB总线上未被使用外设的时钟

7 在STM32中,有4个时钟源①HSI是高速内部时钟,RC振荡器,频率为8MHz。②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接 外部时钟源,频率范围为4MHz~16MHz。

LSI是低速内部时钟,RC振荡器,频率为40kHz。④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。Stm32将时钟信号(如HSE)经过分频或倍频(PLL)后,得到系统时钟,系统时钟经过分频,产生外设所使用的时钟。

8复位目的:将系统强制定位在一个可知状态要求:准确,可靠

STM32F10xxx支持三种复位形式,分别为:系统复位  电源复位   备份区域复位。

9当发生以下任一事件时,产生一个系统复位:1NRST引脚上的低电平(外部复位) 窗口看门狗计数终止(WWDG复位) 3独立看门狗计数终止(IWDG复位) 4软件复位(SW复位) 5低功耗管理复位

未标题-2

10电源复位当以下事件中之一发生时,产生电源复位:1上电/掉电复位(POR/PDR复位)  2从待机模式中返回            电源复位将复位除了备份区域外的所有寄存器。

11启动模式选择 在STM32F10xxx中,由BOOT[1:0]引脚决定了三种不同的启动模式

第四章

1要求设置一绝对地址为0x5a00 的整型变量的值为0xaa55,写代码去完成这一任务

int *ptr = (int *)0x5a00;      *ptr = 0xaa55;

2指针是一个变量,它的值是另外一个变量的地址   指针所指向的变量的类型,就是指针的类型

3 指针的三要素1、指针指向的地址;2、指针指向地址上的内容;3、指针本身的地址

4位运算符&  位与(两个数对应位都为1结果才为1)|   位或(两个数对应位有一个为1结果则为1 )^  位异或(两个数对应位不同结果则为1 )~  按位取反(单目运算符)移位运算符<<   左移>>     右移

举例  flag &= MASK  flag=00000010 mask=10110110 结果为 00000010

5嵌入式系统中经常要对变量或寄存器进行位操作。给定一个int型变量a,写两段代码,第一个将a的bit 3置为1,第二个将a的bit 3置为0,第三个将a的bit 3取反。以上三个操作中,要保持其它位不变   #define BIT3  (0x01<<3)(BIT0就是0x01,BIT7就是0X08
static int a;                
1void SetBit3(void) {a |= BIT3;}  2void ClearBit3(void) {a &= ~BIT3;}3 void qufanBit3(void){a ^= BIT3;}

第五章

1 GPIO 通用型输入输出   主要用于需要用到数字量输入/输出的场合  继电器、 LED灯、蜂鸣器的控制;传感器状态、高低电平等信息的输入

2工作模式  1浮空输入模式2上拉输入模式3下拉输入模式4模拟输入模式5推挽输出模式6开漏输出模式7推挽复用输出模式8开漏复用输出模式

3 GPIO配置   GPIO 8种模式(1)浮空输入:IN_FLOATING(2)带上拉输入:IPU(In Push_Up

(3)模拟输入:AIN(Anolog In)(4)带下拉输入:IPD(In Push_Down)(5)开漏输出:Out_PD(OD 代表开漏,既Open Drain)(6)推挽输出:Out_PP(PP代表推挽式,Push_Pull

(7)复用功能推挽输出:AF_PP(AF代表复用功能,Alternate-Fuction)(8)复用功能开漏输出:AF_OD          3个输出速度      2MHz,10MHz,50MHz

第六章

1CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程称为中断。EG:吃饭时突然手机铃响…中断方式优点:大大地提高了CPU的工作效率。

2STM32 目前支持的中断共 84 个(16 个内部+68 个外部中断通道),还有16 级可编程的中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)

3每个中断都可以配置16种优先级,因为stm32有4个位储存优先级级数,数字越低越优先。STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应式优先级,每个中断源都需要被指定这两种优先级 。区别:抢占式优先级可以中断嵌套  响应式优先级不能嵌套

4外部中断/事件控制器(EXTI)由20个产生事件/中断要求的边沿检测器组成。

每个输入线可以独立地配制输入类型和对应的触发事件。

每个输入线都可以被独立地屏蔽,由挂起寄存器保持着状态线的中断要求。

5  外部中断编程步骤1 开启时钟(GPIO, AFIO)2 GPIO配置3 EXTI配置4 NVIC配置

5 中断服务程序编写

6查询方式 main()

{

开启GPIO时钟

GPIO配置

while(1)

{

按键扫描

if (KEY1按下)

流水灯花样1

if(KEY2按下)

流水灯花样2

}

}

无操作系统程序编写

         void main (void)
{                

                   Initial();            

                   while(1){

                   if ( TestMsg( MSG_SOME_KEY_DOWN ) ){   

                                     FunKeyProc();

                                     ClearMsg( MSG_SOME_KEY_DOWN );

                            }

                            else if ( TestMsg( MSG_UPDATE_OUT ) ){

                                     UpdateDisplay();

                                     ClearMsg( MSG_UPDATE_OUT );

                            }

                            else if

                            ......
         }

         }

第七章

1通信接口分为  串行通信和并行通信     串行通信又分为单工通信 半双工通信和全双工通信        并行通信又分为

2串口配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;              //TX->PC10 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出   GPIO_Init(GPIOC, &GPIO_InitStructure);                        //TX初始化


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;               //RX->PC11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //
浮空输入
GPIO_Init(GPIOC, &GPIO_InitStructure);                        //RX
初始化

     //将USART3的TXD和RXD重映射到PC10和pc11

         GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);

2编程时使用的几个概念

波特率:单位时间传输码元的个数

校验:由于是异步通信,出错的可能性要大于同步通信,所以协议上提供了奇校验、偶校验等校验方法。但一般在近距离通信时不使用校验

起始位和停止位:由于是异步通信,一定要有约定好的同步机制,起始位和停止位就是用来同步的。

硬件流控制:属于一种握手机制,普通串口通信是不用硬件流控制的,但是当通信数据量较大、速度较快的时候,如果没有硬件流控制,会出现数据丢失的现象。硬件流控一般有2根线:CTS和RTS

3USART的帧格式  全为1的是空闲帧   全为0的是断开帧

{WJ5BRXKQK{SDQKWUE37M94

第八章

1软件延时//Subroutine:     Delay1ms

void delay_ms(unsigned int Counter)

{

         unsigned int i;

for(; Counter !=0; Counter--)

         {i = 14400;while(i--)}        }

2    STM32中一共有11个定时器,其中2个高级控制定时器,4个通用定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器

3定时器的时基单元由三个模块组成

计数器方向控制由TIMx_CR1中的DIR位控制

递增计数,递减计数,中央对齐计数

溢出时产生更新事件

每次更新事件时刷新预分频寄存器和自动重载寄存器

4计数器模式

1.jpg

5T = 1/CK_CNT= (TIMx_PSC+1) / CK_PSC

TIMx_ARR = (定时时间 /T)-1

         = 定时时间*CK_PSC/(TIMx_PSC+1) - 1     

6 GPIO配置 void GPIO_Configuration(void)

{

    // statement I/O structure

        GPIO_InitTypeDef GPIO_InitStructure;

        

         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  //选择PA0

         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出

         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);         //应用

}

7 中断配置void NVIC_Configuration(void)

{       

         NVIC_InitTypeDef NVIC_InitStructure;

                                                                                   

         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; 

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority= 1; 

    NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;

    NVIC_Init(&NVIC_InitStructure);

}

8 定时器配置 void TIMER2_Configuration(void)

{

         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

         //采用内部时钟给TIM2提供时钟源

         TIM_InternalClockConfig(TIM2);

         TIM_TimeBaseStructure.TIM_Period        = (2000 - 1);

      TIM_TimeBaseStructure.TIM_Prescaler     = (36000 - 1);

         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  

         TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;

         TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

         //清除更新中断标志

         TIM_ClearITPendingBit(TIM2, TIM_IT_Update); 

      //使能更新中断

         TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

//开启定时器计数

       TIM_Cmd(TIM2,ENABLE);

}

9   用TIM3产生频率为1KHz,占空比为10%的矩型波

TIM_TimeBaseInitTypeDef TIM_TimeBaseStr;

         TIM_OCInitTypeDef TIM_OCInitStr;

         /*Time base configuration*/

   TIM_InternalClockConfig(TIM3);

         TIM_TimeBaseStr.TIM_Prescaler      = (72-1);

         TIM_TimeBaseStr.TIM_Period          = (1000 - 1);

                   TIM_TimeBaseStr.TIM_ClockDivision = TIM_CKD_DIV1;  

         TIM_TimeBaseStr.TIM_CounterMode = TIM_CounterMode_Up;

         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStr);

/* Output Compare PWM Mode configuration*/

    TIM_OCInitStr.TIM_OCMode = TIM_OCMode_PWM1;

         TIM_OCInitStr.TIM_OutputState = TIM_OutputState_Enable;

         TIM_OCInitStr.TIM_OCPolarity = TIM_OCPolarity_High;

         TIM_OCInitStr.TIM_Pulse = 100; //CCR1_Val

         TIM_OC1Init(TIM3, &TIM_OCInitStr);

        

    TIM_Cmd(TIM3,ENABLE);  //启动TIM3

{

         GPIO_InitTypeDef GPIO_InitStructure;

         //开启时钟

         RCC_APB2PeriphClockCmd(

                                     RCC_APB2Periph_GPIOA,  ENABLE);

         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

         // GPIO配置

         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;     

         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

         GPIO_Init(GPIOA, &GPIO_InitStructure);

         //timer3配置

         TIM3_Configuration();

         while(1);

}

 10 SysTick(滴答定时器)是一个24位的系统时钟节拍计数器 当计到0时,将从RELOAD寄存器中自动重装载定时初值并继续计数,同时内部的 COUNTFLAG 标志会置位,触发中断 (如果中断使能情况下)

第十一章

1 实时操作系统:如果一个系统能及时响应外部事件的请求,并能在一个规定的时间内完成对事件的处理,那么这种系统就叫做实时系统。

实时系统与非实时系统的本质区别就在于实时系统中的任务都有时间限制。

2实时操作系统的特点:  强调的是实时性可靠性:1总的来说实时操作系统是事件驱动的,能对来自外界的作用和信号在限定的时间范围内作出响应。

2实时操作系统的特征包括:多任务、有任务(进程/线程)优先级和多种中断级别

第十二章

1  系统各任务之间通过 “任务通信” 的方式,实现任务的信息传递和同步控制, “任务通信” 的载体就是 ---- 事件。用于任务同步和通信的信号量、消息邮箱、消息队列和互斥信号量都叫做“事件”

直接制约关系-例如:有2个任务,任务A和任务B,他们需要通过访问同一个数据缓冲区,合作完成一项工作,任务A负责向缓冲区写入数据,任务B负责从缓冲区读数据。显然,任务A还未向缓冲区写入数据时(缓冲区为空时),任务B因不能从缓冲区得到有效数据而处于等待状态。只有等任务A向缓冲区写入了数据后,才应该通知任务B去取数据。相反,当缓冲区的数据还未被任务B读取时(缓冲区还满时),任务A就不能向缓冲区写入新的数据而应该处于等待状态,只有等任务B自缓冲区读取数据后,才应该通知任务A去写入数据。

间接制约关系-例如:任务A和任务B共享一台打印机,如果系统已经把打印机分配给了任务A,则任务B因不能获得打印机的使用权而应该处于等待状态,只有当任务A把打印机释放后,系统才能唤醒任务B使其获得打印机的使用权。

解决两个问题-互斥关系:即对于某个共享资源,如果一个任务正在使用,则其他任务只能等待,等到该任务释放该资源后,等待的任务之一才能使用它。

解决两个问题-先后次序:一个任务要等其伙伴发来通知,或建立了某个条件后才能继续执行,否则只能等待。

        

相关推荐