-
我根据Standard_FRDM_KW41Z这个历程修改了我项目的MKL27Z64xxx4_flash.icf文件和startup_MKL27Z644.s文件,,在未接管中断的时候,能够正常的运行,能正常的创建线程,也能打开和使用中断#define LOSCFG_PLATFORM_HWI NO但是打开接管中断开关之后,在创建中断的时候,LOS_HwiCreate(PORTB_PORTC_PORTD_PORTE_IRQn, 1, 0,BOARD_SW_IRQ_HANDLER, NULL);返回值是return OS_ERRNO_HWI_ALREADY_CREATED;说是已经创建了,,,不知道为什么,有人遇到类似的问题吗,,可能的原因是什么呢
-
6 SysTick摘要:本文主要SysTick的定义,特性、作用、以及寄存器的内部操作对SysTick进行了较为详细的介绍,最后通过上述介绍,来对SysTick的配置程序以及delay延时函数的实现进行了简要的分析,希望对你有所帮助。1 什么是SysTickSysTick是ARM Cortex-M3/Cortex-M4内核芯片提供的一个24位(最大值2^24 - 1)的系统节拍定时器。因此并非某开发板独有,而是所有基于上述两类处理器的所有开发板都具有的。2 特性以及作用2.1 特性(1)SysTick是24位定时器,因此最大值为0xFF FFFF,注意不要超过此值。(2)SysTick采用倒计时方式,当其设定初值并使能后,每经过一个系统时钟周期,计数值自动减1。(3)具有自动重载和溢出中断功能,当SysTick开启后,就会自动从初始值开始递减计数,当递减到0时,则重新加载。(4)SysTick被绑定在NVIC中,用于产生SysTick异常,可设置中断优先级。配置时只需要使能SysTick中断和处理器中断进入中断服务函数后,硬件会自动清除中断状态和计数标志位,无需手动清除。(5)SysTick是ARM Cortex-M3/M4自带属性,并非外设,无需在RCC寄存器组打开它的时钟。2.2 作用(1)首先SysTick可以用于测量时间,如当做一个闹铃等。但处理器在调试期间若被叫停,则SysTick也暂停。(2)为系统提供一个必要的时钟节拍,为实时操作系统(RTOS)的任务调度提供一个有节奏的“心跳”。(3)我们知道很多开发板本身也存在定时器,但是各有不同。而SysTick的存在方便了程序在不同开发板上的移植。3 寄存器系统定时器一共有4个寄存器具体如下:l SYST_CTRL: 系统定时器控制和状态寄存器l SYST_LOAD:系统定时器重载值寄存器l SYST_VAL:系统定时器当前值寄存器l SYST_CALIB : 系统定时器校准值寄存器其中系统定时器校准值寄存器是在出厂之前就已经配置好的,实际操作时,无需对其进行操作,接下来对上述三个寄存器分别加以介绍:(1)SYST_CTRL寄存器:该寄存器主要用到4位,具体表1所示。表1 SYST_CTRL寄存器信息NameBitTypeDefaultDescriptionENABLE0R/W0使能位,1开启定时器TICKINT1R/W0中断位,1允许产生中断CLKSOURCE2R/W0时钟源,1内核时钟,0外部时钟COUNTFLAG16R0上次读取该寄存器后,SysTick数到0则该位为1。若读该位,自动清零(2)SYST_LOAD寄存器,用24位即0-23,最大值为2^24-1存储的是定时器倒计时的初始值,定时器开启后,从该值倒计时到0,自动从该值重新开始倒计时。具体如表2所示。表2 SYST_LOAD寄存器信息NameBitTypeDefaultDescriptionRELOAD23:0R/W0倒数到0,则自动重载(3)SYST_VAL寄存器,该寄存器主要用于存储系统定时器当前值,因此也是24位即0-23,具体如表3所示。表3 SYST_VAL寄存器信息NameBitTypeDefaultDescriptionCURRENT23:0R/W0读时返回当前倒计时的值,写则清零,同时清除SYST_CTRL寄存器的CONTFLAG标志4 程序从SysTick配置的程序也可以看出只需要对前面所讲的三个寄存器操作即可,具体如下所示。其中参数ticks即为重载值,即两次中断期间的SysTick时钟周期数。__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks){ if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); //重载值要小于0xFF FFFF(24位计数器) SysTick->LOAD = ticks - 1; //对重载寄存器操作设置重载值ticks-1,装载时消耗一个SysTick时钟周期 NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); //设置中断优先级 SysTick->VAL = 0; //初始化当前值寄存器的值 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; //对控制寄存器的2,1,0位分别置1,完成时钟源设置,打开中断,使能定时器 return (0); } 上述函数配合成下面代码就实现了毫秒级延时具体如下。void systick_config(void){ if (SysTick_Config(SystemCoreClock / 1000U)){ while (1){ } } NVIC_SetPriority(SysTick_IRQn, 0x00U);} void delay_1ms(uint32_t count){ delay = count; while(0U != delay){ }}目录主博文:https://bbs.huaweicloud.com/blogs/124244
-
使用mbedtls,连华为云时client_hello报文中的ciphersuite只有MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256这一种,华为云似乎不支持这个cipher?握手失败。
-
LiteOS系统和linux系统差异比较大,如果要一直linux的设备树到LiteOS系统中,可行性如何,求大神指导?
-
我计划使用Liteos开发产品,固件升级是产品开发中比较关心的问题.请问各位大佬有没有关于固件升级这方面的资料呢?我尝试了一下云平台的"开发中心"里的固件升级功能,发现升级包都需要zip格式,对于stm32类产品,我们需要怎么处理这个固件升级的问题呢?
-
5 RTC时钟摘要:主要介绍RTC实时时钟的简介、特性以及RTC架构,之后以一个基于GD32450i-EVAL开发板的实验来介绍包括RTC实时时钟的初始化、以及实验效果,希望对你有所帮助,1 简介RTC(Real_Time Clock)实时时钟,可以像时钟一样输出实际时间的电子设备,一般是集成电路,也称时钟芯片,其核心为晶振(晶体谐振器),分为内部晶振和外部晶振,晶振频率为2的15次方32768Hz,即分频15次为1Hz,晶振为分频计数器提供精确的与低功耗的实基信号来产生秒、分、时、日等信息。该模块拥有一组连续计数的计数器,具有提供包含日期和时间的日历功能,除了亚秒以二进制码显示,其余皆以BCD码显示,修改计数器的值可以重新设置系统当前时间和日期。2 特性(1)由于晶振频率受温度影响,因此需要进行补偿,RTC可以通过软件设置实现夏令时补偿。(2)低功耗,RTC可以工作在省电模式下,并通过软件配置来智能唤醒。唤醒后或系统复位后,RTC的设置和时间维持不变。(3)参考时钟检测功能:可通过外接更高精度的低频时钟源来提高精度(4)数字校准功能:通过调整最小时间单位来进行日历校准。(5)通过移位功能进行亚秒级调整。(6)提供到2099年内的日历功能。(7)记录事件时间的时间戳功能。(8)可编程的日历和两个位域可屏蔽的闹钟。(9)可屏蔽的中断源:闹钟0和1;时间戳检测;侵入检测;自动唤醒事件。(10)20个32位通用别分寄存器,可以在省电模式下保存数据,当有外部事件侵入时,备份寄存器将会复位。3 RTC结构由RTC结构框图可知RTC主要组成包括以下几部分:(1)闹钟事件/中断和侵入事件/中断。(2)32位备份寄存器。(3)16位自动递减计数器主要用于周期性产生唤醒标志,该功能通过WTEN置1来使能,可以工作在省电模式。(4)3个时钟源。(5)两种数字粗校准方法数字粗校准和数字平滑校准。注意两种方法不可以同时使用。前者以异步预分频器输出为源,增加或减少ck_apre周期,后者通过调整校准周期内RTC时钟脉冲个数方式来校准RTC频率(6)4种可选的RTC输入功能和4种可选的RTC输出功能。(7)2个预分频一个7位异步预分频,主要用于降低功耗;一个15位同步预分频。同时使用的时候,建议异步分频器的值尽可能大。(8)影子寄存器。当APB总线访问RTC日历寄存器RTC_DATE、RTC_TIME、RTC_SS时,BPSHAD=0时(默认为0),APB总线访问影子寄存器。每两个RTC时钟影子寄存器值会更新为真实日历寄存器的值。同时RSYNF位也会再次置位。在Deep-sleep和Standby模式时,影子寄存器不会更新。退出这两种模式,软件必须清除RSYNF位。如果想要在BPSHAD=0时读取日历寄存器的值,需等待RSYNF置1。当系统复位时将复位影子寄存器。(9)各类寄存器如RTC真实日历寄存器、RTC控制寄存器、RTC预分频寄存器、RCT唤醒定时器寄存器、RTC粗校准寄存器、RTC侵入寄存器等等。图1 GD32450i-EVAL的RTC架构图4 RTC程序初始化static void rtc_pre_config(void){ /* enable access to RTC registers in backup domain */ rcu_periph_clock_enable(RCU_PMU); //使能PMU时钟 pmu_backup_write_enable();//PMU_CTL寄存器BKPWEN位被清零,因此写RTC寄存器需要先写该位 #if defined (RTC_CLOCK_SOURCE_IRC32K) rcu_osci_on(RCU_IRC32K); rcu_osci_stab_wait(RCU_IRC32K); rcu_rtc_clock_config(RCU_RTCSRC_IRC32K); prescaler_s = 0x13F; prescaler_a = 0x63; #elif defined (RTC_CLOCK_SOURCE_LXTAL) rcu_osci_on(RCU_LXTAL);//打开晶振并选择晶振类型 rcu_osci_stab_wait(RCU_LXTAL);.//晶振准备就绪 rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);//配置RTC时钟源 prescaler_s = 0xFF; prescaler_a = 0x7F; #else #error RTC clock source should be defined. #endif /* RTC_CLOCK_SOURCE_IRC32K */ rcu_periph_clock_enable(RCU_RTC); //启用RTC时钟 rtc_register_sync_wait(); //等待直到RTC_TIME和RTC_DATE寄存器与APB时钟同步,并且影子寄存器被更新}5 运行结果除RTC相关配置只需要额外附加串口打印函数即可,硬件部分连接与前面串口系列一致。当程序运行时候,串口软件显示默认时间,每次按下wakeup按键的时候,会重新设置时间,并显示到串口,具体结果如图2所示。图2 串口时间显示其中的系统时间可以修改具体如下图所示,在中断回调函数中修改系统时间即可实现对上述显示时间的修改。具体如图3所示。图3 中断回调函数时间修改修改上述程序后,再次下载到开发板,可见系统显示时间如下图所示。图4 修改后时间显示目录主博文:https://bbs.huaweicloud.com/blogs/124244
-
LiteOS连接华为OceanConnectDemo
-
4 用户按键与LED灯1 GD32450i-EVAL硬件回顾 GD32450i-EVAL开发板有4个按键,分别为Reset复位键、Wakeup键、Tamper键和User按键。同时还有3个LED灯,分贝为LED1、2、3。2 目的 通过用户按键控制LED的实验,即使用四个按键中的Tamper按键进行对于LED1的控制。这里与中断的不同的是使用GPIO轮询模式来检测IO端口的输入值,如果输入为低电平,将等指定待延时时间。之后再次检测IO端口的输入状态。如果输入仍然为低电平,表明按键成功按下,翻转LED1的输出状态。通过上述方式,来学习使用GPIO来控制LED灯和按键,同时学会使用SysTick来控制时延。当然上述实验也可以使用不同的按键控制不同的LED灯。只需要对函数参数进行简单的修改即可。3 硬件原理3.1 LED灯原理 如图1所示,LED灯的阴极接地,而阳极通过电阻后接到了MCU的PF引脚上,因此可见当引脚PF(GPIO)输入为高电平时LED灯点亮,当其输入为低电平时LED灯熄灭。图1 LED灯原理图3.2 按键驱动原理 如图2所示,该图显示了GD32450i-EVAL开发板的除复位reset按键的其余3个按键Wakeup、Tamper、以及USER按键。其原理相同,以Tamper为例,都是当按键按下时,引脚PC13(GPIO)此时接到GND上,当按键弹起时,引脚PC13(GPIO)接到高电平上。图2 按键驱动原理图4 程序简介 其程序大部分与中断控制LED灯的方式相似但是控制方式是轮训的方式,具体如下: // 初始化按键 gd_eval_key_init(KEY_TAMPER,KEY_MODE_GPIO); //配置SysTick时钟定时器 systick_config(); // 初始化LED灯 gd_eval_led_init(LED1); while(1){ // 查看Tamper按键的状态 if(RESET == gd_eval_key_state_get(KEY_TAMPER)){ //延时100ms delay_1ms(100); //再次查询Tamper按键状态 if(RESET == gd_eval_key_state_get(KEY_TAMPER)){ //为位操作寄存器和位清除寄存器写数据 gpio_bit_write(LED1_GPIO_PORT, LED1_PIN, (bit_status)((1 - gpio_output_bit_get(LED1_GPIO_PORT, LED1_PIN)))); } } }5 实验效果 本实验中的Tamper按键相当于一个LED1的“开关”。当我们将程序下载到开发板后,首先按reset按键。。按下Tamper按键会使得LED1点亮,当再次按下Tamper按键时,LED1将会熄灭。具体实验效果如下图所示。图3 LED灯点亮 图4 LED灯熄灭主文博客链接:https://bbs.huaweicloud.com/blogs/124244
-
玩转 LiteOS 内核教程https://liteos.github.io/tutorials/kernel/这个页面的样例工程下载链接就是失效的。还有在github上更新大部分都是2018年或者之前的,不是很理解,华为2019年liteos没有任何改进吗?资料这部分能不能在国内有个自己的镜像点呢。github上面下载并不迅速。
-
3 GPIO摘要:本文主要从GPIO的定义、工作模式、特色、工作场合、以及GD32450i-EVAL开发板的引脚、对应的寄存器以及GPIO的流水灯示例对GPIO加以介绍,希望对你有所帮助。1定义 GPIO(Gennral-purpose input/output)通用型输入输出,即“IO”口、引脚。既然通用也就是说它是芯片上一个干什么都行的引脚。2 GD32450i-EVAL引脚说明 如图1所示GD32450i-EVAL开发板一共有140(16 * 8 + 12)个通用I/O引脚,PA-PI共9 组,其中PA-PH8组中每组有0-15共16个引脚,外加PI0-PI11共12个引脚。图1 GD32450i-EVAL引脚实物图3 GPIO 工作模式 输入、输出(推挽或开漏)、外设备用功能、模拟模式。而且都可以配置为上拉、下拉、或无上拉/下拉。除了模拟模式外,都具备大电流驱动能力。4 功能 GPIO主要功能都是依托于寄存器实现,每个通用I/O端口都可以通过控制寄存器配置为输入、输出、备用功能或模拟方式。当选择备用功能时,引脚通过AF使能来选择,当端口配置为输出时,可以通过GPIO输出模式寄存器配置为推挽或开漏模式。输出端口的最大速度可以通过GPIO输出速度寄存器配置,每个端口可以通过上下拉寄存器配置为浮空、上拉、下拉功能。4.1 主要寄存器 (1)#define GPIO_CTL(gpiox) REG32((gpiox) + 0x00U) 端口控制寄存器 (2)#define GPIO_OMODE(gpiox) REG32((gpiox) + 0x04U) 端口输出模式寄存器 (3)#define GPIO_OSPD(gpiox) REG32((gpiox) + 0x08U) 端口输出速度寄存器 (4)#define GPIO_PUD(gpiox) REG32((gpiox) + 0x0CU) 端口上拉/下拉寄存器 (5)#define GPIO_ISTAT(gpiox) REG32((gpiox) + 0x10U) 端口输入状态寄存器 (6)#define GPIO_OCTL(gpiox) REG32((gpiox) + 0x14U) 端口输出状态寄存器 (7)#define GPIO_BOP(gpiox) REG32((gpiox) + 0x18U) 端口位操作寄存器 (8)#define GPIO_LOCK(gpiox) REG32((gpiox) + 0x1CU) 端口配置锁定寄存器: (9)#define GPIO_AFSEL0(gpiox) REG32((gpiox) + 0x20U) 备用功能选择寄存器0 (10)#define GPIO_AFSEL1(gpiox) REG32((gpiox) + 0x24U) 备用功能选择寄存器1 (11)#define GPIO_BC(gpiox) REG32((gpiox) + 0x28U) 位清除寄存器 (12)#define GPIO_TG(gpiox) REG32((gpiox) + 0x2CU) 端口位翻转寄存器4.2 对应特性 (1)输入/输出方向控制。 (2)施密特触发器输入功能使能控制。 (3)每个引脚都具有弱上拉/下拉功能。 (4)推挽/开漏输出使能控制。 (5)置位/复位输出使能。 (6)输出驱动速度选择。 (7)模拟输入/输出配置。 (8)备用功能输入/输出配置。 (9)端口锁定配置。 (10)单周期输出翻转功能。5 应用场景 (1)上拉、下拉输入:检测外部信号,如按键等。 (2)浮空输入模式:由于输入阻抗较大一般用作标准通信协议的I2C、USART的接收端。 (3)普通推挽输出:输出电平为0和3.3v的场合。 (4)普通开漏输出:电平不匹配的场合,如需输出5V高电平,需要外部添加上拉电阻,电源5V,GPIO设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出5V电平。 (5)复用模式:根据对应的复用功能选择。 注意:使用任意一种开漏模式都需要接上拉电阻。6 示例 以流水灯为例,使用GPIO来控制LED灯,GD32450i-EVAL开发板上有三个LED灯,设置间隔200毫秒,循环点亮,然后一起熄灭,循环此过程。 首先初始化LED时钟,之后配置LED的GPIO引脚,配置好引脚之后对LED灯进行点亮、延时、熄灭即可。 void gd_eval_led_init (led_typedef_enum lednum) { // 使能LED时钟 eriph_clock_enable(GPIO_CLK[lednum]); // 设置GPIO模式 gpio_mode_set(GPIO_PORT[lednum], GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN[lednum]); // 设置GPIO输出以及速度 gpio_output_options_set(GPIO_PORT[lednum], GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN[lednum]); // 操作位清除寄存器 GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum]; } 实现上述对于LED灯的初始化,之后只需要对LED灯和时钟进行操作即可,灯亮使能位操作寄存器,灯灭使能位清除寄存器即可。 while(1){ gd_eval_led_on(LED1); delay_1ms(200); gd_eval_led_on(LED2); delay_1ms(200); gd_eval_led_on(LED3); delay_1ms(200); gd_eval_led_off(LED1); gd_eval_led_off(LED2); gd_eval_led_off(LED3); delay_1ms(200); } 实验效果如图2所示,具体见附件。图2 流水灯实验效果图 博客链接:https://bbs.huaweicloud.com/blogs/126778 目录主文链接:https://bbs.huaweicloud.com/blogs/124244
-
运行调试信息main.c函数#include "stdio.h" #include "stdlib.h" #include "string.h" #include "los_config.h" #include "los_base.h" #include "los_sys.h" #include "los_typedef.h" #include "los_hwi.h" #include "los_task.ph" #include "los_sem.h" #include "los_event.h" #include "los_memory.h" #include "los_queue.ph" #include "stm32f10x.h" #include "bsp_led.h" #include "bsp_usart.h" #include "dwt.h" #include "bsp_gpio.h" #include "stm32f10x_it.h" #include "ff.h" #include "bsp_sdio_sdcard.h" #include "task.h" #include "agent_tiny_demo.h" #if defined WITH_AT_FRAMEWORK #include "at_api_interface.h" #endif VOID HardWare_Init(VOID); UINT32 creat_main_task(); UINT32 create_task1(void); void Hwi_Init(void); UINT32 g_TskHandle; VOID HardWare_Init(VOID) { /* Initialize all configured peripherals */ dwt_delay_init(SystemCoreClock); LED_Init(); USART1_Config(); GPIO_Config(); Hwi_Init(); printf("Welcome to IoT-Club, This is STM32F103 Board.\r\n"); } VOID main_task(VOID) { #if defined(WITH_LINUX) || defined(WITH_LWIP) hieth_hw_init(); net_init(); #elif defined(WITH_AT_FRAMEWORK) && (defined(USE_SIM800C) || defined(USE_ESP8266) || defined(USE_AIR720) ||defined(USE_SIM7600CE)) extern at_adaptor_api at_interface; at_api_register(&at_interface); at_api_init(); #else #endif //user_hw_init(); agent_tiny_entry(); } UINT32 creat_main_task() { UINT32 uwRet = LOS_OK; TSK_INIT_PARAM_S task_init_param; task_init_param.usTaskPrio = 0; task_init_param.pcName = "main_task"; task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)main_task; task_init_param.uwStackSize = 0x1000; uwRet = LOS_TaskCreate(&g_TskHandle, &task_init_param); if(LOS_OK != uwRet) { return uwRet; } return uwRet; } UINT32 create_task1(void) { UINT32 uwRet = LOS_OK; TSK_INIT_PARAM_S task_init_param; task_init_param.usTaskPrio = 1;//ÈÎÎñÓÅÏȼ¶ task_init_param.pcName = "task1";//ÈÎÎñÃû task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)task1;//Ö¸¶¨ÈÎÎñÈë¿Úº¯Êý task_init_param.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;//ÉèÖÃÈÎÎñ¶ÑÕ»´óС uwRet = LOS_TaskCreate(&g_TskHandle,&task_init_param);//µ÷ÓÃÈÎÎñ´´½¨º¯Êý if(uwRet !=LOS_OK) { return uwRet; } return uwRet; } UINT32 create_sdtask(void) { UINT32 uwRet = LOS_OK; TSK_INIT_PARAM_S task_init_param; task_init_param.usTaskPrio = 1;//ÈÎÎñÓÅÏȼ¶ task_init_param.pcName = "sdtask";//ÈÎÎñÃû task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)sdtask;//Ö¸¶¨ÈÎÎñÈë¿Úº¯Êý task_init_param.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;//ÉèÖÃÈÎÎñ¶ÑÕ»´óС uwRet = LOS_TaskCreate(&g_TskHandle,&task_init_param);//µ÷ÓÃÈÎÎñ´´½¨º¯Êý if(uwRet !=LOS_OK) { return uwRet; } return uwRet; } // interrupt init void Hwi_Init(void) { UINTPTR uvIntSave; uvIntSave = LOS_IntLock();//masking interrupt LOS_HwiCreate(SDIO_IRQn,0,0,SDIO_IRQHandler,0); LOS_IntRestore(uvIntSave);//recovery interrupt } int main(void) { UINT32 uwRet = LOS_OK; HardWare_Init(); uwRet = LOS_KernelInit(); if (uwRet != LOS_OK) { return LOS_NOK; } uwRet = create_sdtask(); if (uwRet != LOS_OK) { return LOS_NOK; } //uwRet = creat_main_task(); if (uwRet != LOS_OK) { return LOS_NOK; } LOS_Start(); } 中断函数
-
摘要: 主要讲解物联网技术的积累,学习了第一集串口之后,相信大家对整个开发板的应用已有大致了解,本期讲解第二集中断,本文从中断定义、意义以及中断处理过程、分类、以及中断的示例加以介绍。2 中断1 什么是中断? 我们来举个例子,小明在厨房用煤气烧水需要5分钟,主要动作包括接水、打开煤气、等待水开,关闭煤气。在等待水开的过程,快递员来送快递,小明开门签收。在这一系列动作中就是一个中断过程。具体如下; (1)小明:CPU (2)烧水:主程序 (3)门铃响:中断信号 (4)开门发现是快递:查询中断号 (5)签收快递:中断处理程序 (6)签收完快递后继续烧水:中断返回 所谓中断就是CPU在执行主程序期间,被某些事件打断,转而处理该事件,处理完后继续执行主程序的过程。2 为什么要中断? 回顾上面的例子,由于中断机制,小明可以同时处理多个任务,提高了它的并发处理能力,对于计算机也是如此,可以提高CPU的处理效率。当然中断的优点不只如此。3 中断处理过程 (1)保存现场 (2)执行中断服务程序 (3)从中断服务返回 (4)回复现场 具体如图1所示图1 中断处理流程图4 中断的分类 (1)不可屏蔽中断:一旦提出请求,CPU必须无条件响应。 (2)可屏蔽中断:发出请求,CPU可响应可不响应。除了受本身的屏蔽位控制外,还有受一个总的控制,即CPU标志寄存器中的中断允许标志位(IF)的控制,IF位为1,可以得到CPU响应,否则不响应。5 GD32450i-EVAL的中断/事件控制器(EXTI) (1)GD32450i-EVAL集成的是Cortex-M4。Cortex-M4集成了嵌套式矢量型中断控制器来实现高效的异常和中断处理。EXTI包括23个相互独立的边沿检测电路并且能向处理器内核产生中断请求或唤醒事件,提供了三种触发类型:上升沿、下降沿、以及任意沿触发,其每一个边沿检测电路都可以独立配置和屏蔽。 (2) Cortex-M4集和嵌套式矢量型中断控制器在处理模式下对所有异常进行优先级区分以及处理。当异常发生时,系统自动将当前处理器工作状态压栈,在执行完中断服务子程序后自动将其出栈。取向量和当前工作态压栈并行进行的,从而提高了中断入口效率。处理器支持咬尾中断,可实现背靠背中断,大大削减了反复切换工作状态带来的开销。 (3)EXTI触发源包括来自I/O管教的16根线以及内部模块的7根线。通过配置SYSCFG_EXTISSx寄存器,所有的GPIO管教都可被选为EXTI的触发源。 (4)SysTick校准值设定为25000,SysTick始终频率配置为HCLK/8,此时若HCLK时钟呗配置为200MHz,则SysTick中断会1ms响应一次。6 中断的初始化过程 (1)使能IO时钟,配置I/O为输入模式 rcu_periph_clock_enable(KEY_CLK[key_num]); gpio_mode_set(KEY_PORT[key_num], GPIO_MODE_INPUT, GPIO_PUPD_NONE,KEY_PIN[key_num]); (2)打开syscfg时钟 rcu_periph_clock_enable(RCU_SYSCFG); (3)设置IO与中断线的映射关系 (4)配置NVIC,使能中断 nvic_irq_enable(KEY_IRQn[key_num], 2U, 0U); (5)初始化EXIT,选择对应的触发方式 exti_init(KEY_EXTI_LINE[key_num], EXTI_INTERRUPT, EXTI_TRIG_FALLING); (6)设置中断处理函数 exti_interrupt_flag_clear(KEY_EXTI_LINE[key_num]); 通过以上步骤实现对于按键的中断响应,由于GPIO默认状态下式低电平,按键按下后被拉到高电平,此时系统能够检测到中断判定为按键被按下。当按下Tamper按键的时候,对应的LED点亮,再次按下的时候熄灭(中断实验还有很多的方式可以实现包括串口,按键与LED灯等等,也可以结合多种方式,本实验的方式较为简单),具体的开发板响应如下图所示。图2 LED灯熄灭图3 LED灯点亮博文链接:https://bbs.huaweicloud.com/blogs/125748主文博客链接:https://bbs.huaweicloud.com/blogs/124244
-
在论坛上搜不到。但是在LiteOS开发指南中有引用到这个文档。
-
摘要:物联网技术包括万象,其端测开发离不开LiteOS,首先本文主要介绍LiteOS概述包括定义、特点、SDK、应用以及意义,支持的硬件、其与鸿蒙的关系,后续将对开发板的串口、中断、gpio、用户按键、时钟、systick、timer、移植等知识加以介绍,以便于大家更简单的进行LiteOS后续内容的学习,后续知识介绍主要基于GD32450i-EVAL进行开发。1 什么是LiteOS? LiteOS是华为在2015年发布的一款面向IoT领域,遵循BSD-3开源许可协议、构建的的开源的轻量级的物联网操作系统, 其大小为10KB。具备零配置、自发现和自组网能力,让使用 LiteOS 的物联终端能够自动接入支持的网络。2 LiteOS内核的特点 (1)超小内核。 (2)高实时性,高稳定性。 (3)低功耗。 (4)支持功能静态裁剪。 (5)支持动态加载、分散加载。 与正常的操作系统内核一样,包括任务管理、内存管理、时间管理、通信机制、中断管理、队列管理、事件管理、定时器等操作系统基础组件,可以单独运行,内核部分可以参考https://github.com/LiteOS/LiteOS/blob/master/doc/Huawei_LiteOS_Developer_Guide_zh.md。图1 LiteOS内核示意图3 LiteOS SDK LiteOS SDK 是 Huawei LiteOS 软件开发工具包(Software Development Kit),包括端云互通组件,FOTA,JS引擎、传感器框架等内容。图2 SDK架构示意图4 应用及意义 应用:LiteOS可广泛应用于智能家居、个人穿戴、车联网、城市公共服务、制造业等领域 意义:开发门槛低上手快、设备布置以及维护成本低、开发周期短使得硬件开发更为简单。图2 LiteOS应用架构架构图5 支持的硬件 目前LiteOS主要支持ARM Cortex-M0、Cortex-M3、Cortex-M4、Cortex-M7等芯片架构。适配了多种开发板其中包括ST、NXP、GDMIDMOTION、SILICON、ATMEL 等主流开发商的开发板。具体如下表:厂商STNXPMindMotionSILICONATMELGD开发板STM32L053R8TxSTM32F103RBSTM32F411RESTM32F412ZGSTM32F429ZISTM32F429IGSTM32L476RGSTM32F746ZGLPC824LPC54110FRDM-KW41ZFRDM_KL26Z MM32F103 MM32L373MM32L073PFefm32_stk3700 emf32_slstk3400aemf32_slstk3401aATSAM4S-XPROatsamd21ARDUINO ZERO PROGD32F450I-EVALGD32F190R-EVALGD32F103C-EVALGD32F150R-EVALGD32F207C-EVAL 除上述开发板外,还包括LAUNCHXL-CC3220SF、NuTiny-NUC472H、NRF52840-PDK、NuTiny-Nano130K等等。6 LiteOS 和鸿蒙的关系 鸿蒙OS可以说算是LiteOS的一个发展产物,但是他们是两款完全不同的操作系统。7 千里之行始于足下 LIteOS开发 = 硬件 + 操作系统 + 程序代码 我们知道硬件是软件赖以工作的物质基础,对于LIteOS的应用开发来说,他的硬件就是开发板。如果我们对于开发板的相关知识一无所知,那么开发将无法开始。8 干货系列汇总 我将主要基于GD32F450I-EVAL开发板来学习一些关于LiteOS开发的前置知识,具体如下:后续会有持续更新。 主文博客链接:https://bbs.huaweicloud.com/blogs/124244 漫谈LiteOS-漫谈开发板-串口---------------------- https://bbs.huaweicloud.com/blogs/123935 漫谈LiteOS-漫谈开发板-中断-----------------------https://bbs.huaweicloud.com/blogs/125748 漫谈LiteOS-漫谈开发板-gpio----------------------https://bbs.huaweicloud.com/blogs/126778 漫谈LiteOS-漫谈开发板-用户按键与LED灯---------https://bbs.huaweicloud.com/blogs/127583 漫谈LiteOS-漫谈开发板-时钟-----------------------https://bbs.huaweicloud.com/blogs/129397 漫谈LiteOS-漫谈开发板-systick--------------------https://bbs.huaweicloud.com/blogs/133446 漫谈LiteOS-漫谈开发板-timer----------------------https://bbs.huaweicloud.com/blogs/134293 漫谈LiteOS-移植------------------------------------https://bbs.huaweicloud.com/blogs/134857 漫谈LiteOS-启动流程--------------------------------https://bbs.huaweicloud.com/blogs/135976refer:https://liteos.github.io/quick-start/intro/#liteos-内核
-
#### 从github的liteos的dev-desert分支移植上云的组件到已经测试过成功的接管中断的liteos,编译通过了,但出现下面报错>求大佬帮帮忙
上滑加载中
推荐直播
-
华为云AI入门课:AI发展趋势与华为愿景
2024/11/18 周一 18:20-20:20
Alex 华为云学堂技术讲师
本期直播旨在帮助开发者熟悉理解AI技术概念,AI发展趋势,AI实用化前景,了解熟悉未来主要技术栈,当前发展瓶颈等行业化知识。帮助开发者在AI领域快速构建知识体系,构建职业竞争力。
去报名 -
华为云软件开发生产线(CodeArts)10月新特性解读
2024/11/19 周二 19:00-20:00
苏柏亚培 华为云高级产品经理
不知道产品的最新特性?没法和产品团队建立直接的沟通?本期直播产品经理将为您解读华为云软件开发生产线10月发布的新特性,并在直播过程中为您答疑解惑。
去报名
热门标签