ARM汇编的调用
嵌入式开发,尤其是编写BSP的时候,非常接近底层,这个时候有可能用一些汇编指令来保证程序的简洁和高效,但是平常编写代码用到的都是C/C++,那么如何使用汇编指令呢?
其实这个问题也很简单,在C/C++中提供了关键字asm或者ASM来内嵌汇编,使用如下:
asm("WFI");
但是这种方法问题比较大,在Cortex-M平台上,这个语句有很大几率编译不通过,因为各家编译器又实现了自己的宏,具体可以在core_cmx.h中看到,如果我们的项目要在不同的编译器上通过,可以考虑使用条件编译来达标,不过这样付出的成本就很大。
另外一种简单的方法是使用intrinsic.h这个头文件,这个头文件把所有的汇编指令都封装成了诸如__Commnad()的函数形式,并且预编译为二进制包,故不必使用条件编译也能达到相同效果
WFI和WFE
这两条指令的作用都是令MCU进入休眠/待机状态以便降低功耗,但是略有区别:
WFI: wait for Interrupt 等待中断,即下一次中断发生前都在此hold住不干活
WFE: wait for Events 等待事件,即下一次事件发生前都在此hold住不干活
所以使用前要掂量好到底是什么会触发MCU唤醒事件
关键字:STM32 汇编指令 WFI WFE
引用地址:
STM32汇编指令(一)WFI 和 WFE
推荐阅读最新更新时间:2024-03-16 16:10
stm32——端口重映射
我们先来看什么是复用功能? 我们在《stm32f103rc_datasheet.pdf》中可以看到对I/O口的功能描述表格 比如:PC10 I/O口,UART4_TX与SDIO_D2功能都是PC10 I/O口的复用功能。也就是说,PC10 I/O口不仅仅只能进行由内核控制的输入/输出功能,还可以进行由片上外设控制的UART4_TX与SDIO_D2功能。注意:UART4_TX与SDIO_D2功能是来自不同模块的功能。 当我们使用复用功能UART4_TX时,那么PC10 I/O口就由UART外设模块控制,此时PC10 I/O口输入/输出的数据就都来自于UART外设模块了,而不是来自于内核或者其他外设模块。 注意:
[单片机]
STM32的启动过程如何分析
本文分析STM32单片机从上电到运行的过程,目的在于了解STM32单片机从启动到运行的整个过程。 一般我们在使用STM32单片机的时候,都是使用官方提供的驱动文件,移植到自己即将要使用的工程中,移植完成之后再编写自己的逻辑代码,放到main( )函数中,就可以完美的运行起来了。相信很多的人都没有去关注过STM32从启动到运行这个过程都发生了什么,现在就简单分析一些这个过程。 本文以STM32F103为例进行分析。在官方给我们提供的启动文件中,将整个单片机的启动过程要做的事情都已经帮我们做好了,以至于我们在使用这款单片机的时候,几乎可以不会吹灰之力就可以运行起来。STM32F103的启动文件形如: 根据不同的芯片容量,都
[单片机]
STM32笔记——外部中断的配置
一、选择对应芯片 常规操作,这里我们选择F407ZGT6 二、配置sys 选择Serial Wire 三、配置RCC 选择高速外部时钟晶振,系统自动配置相应引脚。 四、配置外部中断引脚 通过查看开发板原理图,找出按键对应引脚 五、设置外部中断引脚 1、上升沿触发(外部中断触发引脚上的电平从低电平跳转到高电平) 2、下降沿触发(外部中断触发引脚上的电平从高电平跳转到低电平) 3、上下边沿均触发 (外部中断触发引脚上有电平变化) 六、开启外部中断 七、配置中断优先级 八、配置时钟 九、生成工程 HAL库GPIO函数库讲解 1、外部中断服务函数 void HAL_GPIO_EXTI_IRQ
[单片机]
STM32初学笔记1之RCC(上)
我参考了STM32的标准外设库中的RCC例程,然后对其在原有的基础上做了一定的修改,单独添加到了RCC_ClkConfig.C和RCC_ClkConfig.H两个文件当中,把这个作为以后系统时钟配置的通用函数,在这里共享出来,示例代码如下: ////////////////////////////////////////////////////////////////////////////////////////////////////// RCC_ClkConfig.C /////////////////////////////////////////////////////////
[单片机]
STM32笔记(十)---DMA(直接存储器访问)
一、 DMA简介 DMA(Data Memory Access),直接存储器访问。主要功能是可以把数据从一个地方搬到另外一个地方,而且不占用CPU。通常为以下传输方式: M- M,存储器到存储器,一般指内部存储器(Flash)与外部存储器(SRAM)的传输。 P- M, 外设到存储器,一般指外设(Periph)与外部存储器的传输。 M- P, 存储器到外设,一般指外部存储器与外设(Periph)的传输。 STM32系列一般分为DMA1、DMA2,两者均可以实现 P- M, M- P,M- M 。 区别:DMA1有7个通道、DMA2有5个通道,同时DMA2在大容量、互联型的芯片上配备。 二、 DMA功能框图 功能框图
[单片机]
基于STM32执行的MQTT协议
单片机源程序如下: /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include main.h #include tim.h #include usart.h #include gpio.h /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include string.
[单片机]
stm32 实现串口中断接收浮点型、整型数据
之前已经实现了在stm32中移植printf函数和scanf函数,相信很多网友也已经熟练掌握这个技能了。最近在项目中遇到了问题,需要在串口助手中向下位机stm32写整型或者浮点型数据。这个时候只能使用串口中断接收函数。 void USART1_IRQHandler(void) { uint8_t ch; while(USART_GetITStatus(USART1, USART_IT_RXNE) == SET) { ch=USART_ReceiveData(USART1); } } 但是很快发现程序这样写过于简陋,只能接收单个字符,不符合我的要求,然后参考网上例
[单片机]
STM32单片机对TFTLCD的驱动设计
看了TFTLCD和FSMC(灵活的静态存储控制器)的简介,还是一知半解,不知所云。 TFTLCD使用80并口,80 并口有如下一些信号线: CS: TFTLCD 片选信号。 WR:向 TFTLCD 写入数据。 RD:从 TFTLCD 读取数据。 D[15: 0]: 16 位双向数据线。 RST:硬复位 TFTLCD。 RS:命令/数据标志( 0,读写命令; 1,读写数据)。 只是记住FSMC在使用的时候要初始化和使能就行了。 关于lcd.c这个文件竟然接近3000行,好吧,我是写不出来,只能在主函数里调用了。 main.c: intmain(void) { u8x=0; u8lcd_id[12];//存放LCDID字符串
[单片机]