stm32

malloc behaviour on an embedded system

半腔热情 提交于 2020-01-09 19:39:43
问题 I'm currently working on an embedded project (STM32F103RB, CooCox CoIDE v.1.7.6 with arm-none-eabi-gcc 4.8 2013q4) and I'm trying to understand how malloc() behaves on plain C when the RAM is full. My STM32 has 20kB = 0x5000Bytes of RAM, 0x200 are used for the stack. #include <stdlib.h> #include "stm32f10x.h" struct list_el { char weight[1024]; }; typedef struct list_el item; int main(void) { item * curr; // allocate until RAM is full do { curr = (item *)malloc(sizeof(item)); } while (curr !=

STM32启动过程启动文件分析

邮差的信 提交于 2020-01-09 04:15:55
一、概述 1、说明   每一款芯片的启动文件都值得去研究,因为它可是你的程序跑的最初一段路,不可以不知道。通过了解启动文件,我们可以体会到处理器的架构、指令集、中断向量安排等内容,是非常值得玩味的。   STM32作为一款高端Cortex-M3系列单片机,有必要了解它的启动文件。打好基础,为以后优化程序,写出高质量的代码最准备。   本文以一个实际测试代码--START_TEST为例进行阐述。 2、整体过程概括   STM整个启动过程是指从上电开始,一直到运行到main函数之间的这段过程,步骤为(以使用微库为例): ①上电后硬件设置SP、PC ②设置系统时钟 ③软件设置SP ④加载.data、.bss,并初始化栈区 ⑤跳转到C文件的main函数 3、整个启动过程涉及的代码   启动过程涉及的文件不仅包含startup_stm32f10x_hd.s,还涉及到了MDK自带的连接库文件entry.o、entry2.o、entry5.o、entry7.o等(从生成的map文件可以看出来)。 二、程序在Flash上的存储结构   在真正讲解启动过程之前,先要讲解程序下载到Flash上的结构和程序运行时(执行到main函数)时的SRAM数据结构。程序在用户Flash上的结构如下图所示。下图是通过阅读hex文件和在MDK下调试综合提炼出来的。 MSP初始值        编译器生成

各大半导体厂商MCU特点兼论MCU程序架构设计

丶灬走出姿态 提交于 2020-01-07 13:31:55
1、瑞萨 瑞萨一句话就是开发门槛高、领域突出。瑞萨是仍在坚持自有架构RL78、G3K等且出货量不小,在汽车领域非常突出,公司的策略也是把自己几乎全压在汽车电子领域——汽车相关产品占了该公司营收份额高达52.7%。笔者仅用过其汽车领域RH850系列,但是用过之后丝毫不觉得好用,只是硬件稳定性高而已。当时公司档次和版权原因常年买很贵的green hills的编译器,当然这款调试编译器的性能自然不必说就是贵一般中小公司根本不会考虑购买。瑞萨还有特点是主业to B,在to C端的高校、培训、工业领域几乎没人知道。 RH850在to B端有一些底层驱动库函数但是也有很多问题拿过来还要自己改好多。驱动之上很多公司用都是自主设计软件架构用一种类似autosar的程序架构,这种做法下面这篇文章说的很好: https://zhuanlan.zhihu.com/p/34573847 这道出了很多公司的苦楚,非不想弃之,奈何要挂名高大上。笔者也参与过此类项目,还调试过MicroSAR,但是用过之后仍然是一知半解,因为很多都是商业代码根本不可能看得懂。 2、NXP 这应该加上之前的Freescale。NXP的MCU架构以ARM核突出,收购了Freescale后也有powerPC的老产品。NXP的to B和to C比较均衡,很多非汽车领域的人不知道瑞萨但没有不知道NXP的比如大名鼎鼎的LPC系列

Why USART2 Send a Garbage Value?

两盒软妹~` 提交于 2020-01-07 08:28:13
问题 Hello i'm using stm32f103c8 and i'm trying to use usart2 but it does not work . when i'm using USART1 with the same configuration of USART2 it works with me well . but USART2 send garbage to the PC terminal can someone help me to solve the problem in the USART2 ? This is the configuration of USART2 : int main(void){ RCC_VidInit(); //INTIALIZE EXTERNAL CRYSTAL OSCILATOR = 8 MHZ RCC_VidEnablePeripheralClock( APB2_BUS , 2 ); //ENABLE CLOCK OF GPIOA CLR_BIT( GPIOA->CRL , 8 ); SET_BIT( GPIOA->CRL

Is volatile required for synchronous ISR access? [duplicate]

时间秒杀一切 提交于 2020-01-07 05:23:12
问题 This question already has answers here : Is it safe to share a volatile variable between the main program and an ISR in C? (5 answers) Closed 2 years ago . In the following code snippet, an interrupt routine uses one of many arrays for its execution. The array used is selected synchronously, not asynchronously (it will never change while the ISR is executing). On a single core microcontroller (this question assumes an STM32L496 if the architecture is important), is the volatile specifier

No data from magnetometer on MPU9255

馋奶兔 提交于 2020-01-07 04:54:38
问题 I have a problem with reading data from the magnetometer on an MPU9255. The accelerometer and gyroscope work properly, but I do not receive any data from the magnetometer. I am working on the STM32F103 target. Has anyone any idea what is wrong with code below? uint8_t Settings = 0x00; uint8_t SettingsM = 0x00; uint8_t SettingsL = 0x22; //mode2 16bit //settings accelerometer and gyroscope HAL_I2C_Mem_Write(&hi2c1, 0xD0, 27, I2C_MEMADD_SIZE_8BIT, &Settings,1,1000); HAL_I2C_Mem_Write(&hi2c1,

STM32 SysTick counting twice as fast as it should

心不动则不痛 提交于 2020-01-07 04:19:26
问题 I have a STM32L476RC nucleo board that I am using to learn STM32. I am using STM32Cube HAL and AC6 System Workbench to develop on. I am trying to stay away from CubeMX as my goal is more towards learning than just getting something to work. The problem that I am having is when I try to set up the systick timer using the code below, it seems to be counting twice as fast as it should. HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); However if I just leave it default form the power-up then it is

STM32基于Rt-thread3.12系统的串口通讯

泪湿孤枕 提交于 2020-01-06 23:10:32
前言 STM32的串口收发可以说是对这个芯片学习的一个基础,相信接触过STM32的朋友首先学会的就是它的GPIO和USART。对GPIO和串口初始化的操作我在这里不做赘述,这些在STM32的例程里面很容易找到学会。我们在这里重点介绍STM32的串口中断接收,以及在RTT系统中我们如何把串口device注册到系统的对象容器里。 关于RT-Thread3.12系统 作为国产小型嵌入式系统中的翘楚,RTT也是被大多数产品所使用。我参与的这个项目RTT的主要工作就是多线程调度和串口device的控制。对于线程的调度先不详细说明,我们这里只介绍串口通讯一个线程的东西。 RTT对象 在 RT-Thread中,所有的数据结构都称之为对象。 其中线程,信号量,互斥量、事件、邮箱、消息队列、内存堆、内存池、设备和定时 器在 rtdef.h 中有明显的枚举定义,即为每个对象打上了一个数字标签。我们这里的对象就特指设备,而我们的设备就特指串口。 那么我们使用这个对象有什么用处呢,我私以为有两个最大的用处,一是有利于设备管理,二是基于程序安全考虑。我使用这一功能的时候基本与第一个用处不沾边,因为我们就一个串口设备。主要还是基于安全的考虑才使用RTT对象。 使用系统的对象也就是把硬件驱动注册到系统中,让系统对就硬件进行操控,我们再通过系统操控硬件。 串口注册到系统

STM32延时函数的三种方法

ⅰ亾dé卋堺 提交于 2020-01-06 23:08:01
单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ms( )。 1.普通延时法 这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。下面的代码是在网上搜到的,经测试延时比较精准。 //粗延时函数,微秒 void delay_us(u16 time){ u16 i=0; while(time--){ i=10; //自己定义 while(i--) ; } } //毫秒级的延时 void delay_ms(u16 time){ u16 i=0; while(time--){ i=12000; //自己定义 while(i--) ; } } 2.SysTick 定时器延时 CM3 内核的处理器,内部包含了一个SysTick 定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。SysTick 在STM32的参考手册里面介绍的很简单,其详细介绍,请参阅《Cortex-M3 权威指南》。 这里面也有两种方式实现: a.中断方式 如下,定义延时时间time_delay,SysTick_Config()定义中断时间段,在中断中递减time_delay,从而实现延时

STM32基本GPIO操作:按键输入(扫描+外部中断)

冷暖自知 提交于 2020-01-06 19:47:47
(涉及专有名词较多,难免解释不到位,若有错误还请指出,谢谢!) 硬件连接图如下: 一、扫描 思路是在main函数中通过死循环来扫描端口电平状态检测,以此判断按键是否按下。实现较为简单。 1.初始化(注意C语言中变量声明需放在函数开头) 以下是初始化PB5端口(LED灯)的代码,每一条语句的含义在我另一篇博客里 GPIO_InitTypeDef GPIO_Init1; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_Init1.GPIO_Pin = GPIO_Pin_5; GPIO_Init1.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init1.GPIO_Speed = GPIO_Speed_50MHz; GPIO_SetBits(GPIOB, GPIO_Pin_5); //先熄灯 GPIO_Init(GPIOB, &GPIO_Init1); 以下是初始化PE3端口(按键)的代码 GPIO_InitTypeDef GPIO_Init2; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); GPIO_Init2.GPIO_Pin = GPIO_Pin_3; // 设置GPIO端口号为5 GPIO_Init2.GPIO_Mode =