stm32

How do I use the STM32CUBEF4 HAL library to read out the sensor data with i2c?

岁酱吖の 提交于 2020-01-12 08:26:13
问题 I want to use the latest HAL library instead of Standard Peripheral Library. And i want to readout the BMA250E G-sensor's chip_id, but it doesn't work. Value of aRxBuffer always keep at 0x00. But it should be 0xf9! What's wrong in my code? ‪#‎include‬ "stm32f4xx_hal.h" #define I2Cx_SDA_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() #define I2Cx_SDA_PIN GPIO_PIN_9 #define I2Cx_SDA_GPIO_PORT GPIOB #define I2Cx_SDA_AF GPIO_AF4_I2C1 #define I2Cx_SCL_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()

STM32开发GPRS传输的GPS定位器-android studio开发客户端APP显示轨迹

痞子三分冷 提交于 2020-01-11 23:35:50
前面文章介绍如何开发定位器硬件,单片机软件,服务器软件,上位机客户端软件,下面介绍如何使用android studio开发客户端APP显示轨迹。 能自己做的事从来不求人,前面用C#实现了PC端显示定位数据轨迹,用android studio开发客户端APP显示轨迹的流程也是大同小异的,只是开发语言的不同,安卓应用程序是使用Java开发的,但是C#和Java很相似。 用android studio开发客户端APP显示轨迹大概分这么几个步骤,1,编写xml文件,2,TCP服务器通信部分,3,调用百度地图API实现轨迹绘制。 1,XML布局文件加入百度地图mapview,和两个文本框,代码及UI界面如下 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android

STM32之PWM

允我心安 提交于 2020-01-11 20:11:21
STM32 PWM PWM是脉冲宽度调制,是英文“Pulse Width Modulation” 的缩写,简称脉宽调制。用来控制电机,灯的亮暗,通过PWM配置后的引脚会输出方波。 pwm结构体初始化 //引脚和时钟的驱动就不在写出参考上两节 TIM_OCInitTypeDef TIM_OCInitStructure ; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2 ; //选择 PWM 模式 2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable ; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High ; //输出极性高 TIM_OC2Init ( TIM3, & TIM_OCInitStructure ) ; //初始化 TIM3 OC2 TIM_OC2PreloadConfig ( TIM3, TIM_OCPreload_Enable ) ; //使能预装载寄存器 TIM_Cmd ( TIM3, ENABLE ) ; //使能 TIM3 PWM调节脉宽的函数 //参数1是说用定时器参数2是比较值 void TIM_SetCompare2 ( TIM_TypeDef* TIMx,

STM32 HAL UART 框架初体验

风格不统一 提交于 2020-01-11 18:32:09
文章目录 背景 开发步骤 配置环境 开始配置 HAL 背景 STM32开发平台,时至今日发展的已经相当成熟了,尤其对于外围硬件接口的抽象封装库,即HAL。好多基于STM32开发的工程师,习惯于直接操作外围接口相关的寄存器来完成所谓的驱动开发,其实,ST公司早就为大家准备好了对于这些外围接口的驱动框架,我们只需要直接拿来就可以使用。 可是以前,基于STM32平台开发时,存在一个问题就是,变换MCU型号时,需要在新老MCU之间移植驱动程序,移植过程中可能出现很多莫名其妙的问题,导致浪费了很多宝贵的开发时间,如何避免这种问题呢?其实,ST早就为大家考虑到了这一点,其开发了STM32CubeMX工具,基于该工具,我们可以轻松的完成各种外围接口的配置工作,而且最为神奇的就是,配置完成之后,该工具会自动生成工程代码,我们基于此,就可以直接进行开发了,免去了很多不必要的硬件寄存器配置工作。当然,对于特殊需求,我们还是需要去手动配置一些硬件寄存器,但是,这项工作大部分时间是不需要的。 既然,ST公司为我们提供了这么好用的工具,我们为什么不用起来呢?下面就基于UART的配置过程,来逐步的讲解一下,如何基于STM32CubeMX、Kiel和STM32 HAL来配置生成一个可用的开发环境。 开发步骤 配置环境 工欲善其事,必先利其器。首先第一步就是安装STM32CubeMX环境

STM32 volatile关键字

£可爱£侵袭症+ 提交于 2020-01-11 10:05:55
为了提供对特殊地址的稳定访问。 [C] 纯文本查看 复制代码 ? 1 2 3 int i=10; int j=i; //1 int k=i; //2 此时编译器对上面代码进行优化,因为在1、2语句中,i 没有被用作左值(没有被赋值)。这时候编译器认为i 的值没有发生改变,所以在1语句时从内存取出 i 的值赋给 j 之后,这个值没有被丢掉,而是在2语句中继续用这个值赋值给k。编译器不会生成汇编代码重新从内存里取 i ,这样提高了效率 [C] 纯文本查看 复制代码 ? 1 2 3 volatile int i=10; int j=i; int k=i; volatile 关键字告诉编译器,i 是随时可能发生变化的,每次使用它的时候必须从内存取出 i 的值,因而编译器生成的汇编代码会重新从 i 的地址处读取数据放在k中。 来源: https://www.cnblogs.com/ransn/p/8483155.html

这是一个卑微电子信息学员的开始

元气小坏坏 提交于 2020-01-10 22:34:56
这是一个卑微电子信息学员的开始 这是学习stm32的第一天 寒假开始了,卑微电子信息学员开始了stm32的学习过程。 stm32的初始化 一. 引脚初始化 ,需要stm32的工程图以及CubeMx软件; GPIO引脚:选中引脚进行选择输入或者输出,在system core的GPIO中选择上拉、下拉电阻或者悬空; 晶振引脚,脚12、13,一个选为in,一个选为out,在system core的RCC中选择crystal/ceramic resonator,并将晶振的频率调至需要的频率(USB为48MHz); USB引脚,脚PA12,PA11,一个选择DP,一个选择DM; 功能快捷键; 附最简单的接线图如下: 二. 调试 ,需要串口调试助手以及keil工具; 编译:编译时间较长,建议减少编译次数; 烧录:烧录很快,但只会烧录最近编译成功的软件; 调试:可以放置短点进行单步调试(F10),但是调试的时间中keil软件占用串口,不能进行另外的串口调试或者测试; 三.USB转串口 ,这个着实复杂; 网上的代码都比较高级,不适合初学者使用; 代码在Application/User的子文件usbd_cdc_if.c中,有用户可以进行调用和使用的代码,在这个文件中的代码会被一遍遍的调用,可以直接在其中进行修改; 在main函数中调用usbd_cdc_if.c中的函数是要在文章的开头进行extern

STM32串口遇到的一个问题

夙愿已清 提交于 2020-01-10 19:43:26
做HLW8032电能表项目中关于USART使用DMA接收定长数据的问题 1:由于HLW8032芯片一上电,芯片就会通过串口每隔50ms向STM32发送24字节的数据,且我不能通过STM32控制HLW8032发送数据,由于STM32初始化需要一段时间,所以当STM32接收数据时会出现丢包的情况。。 2:解决方法:使用USART空闲中断,在初始化时先不使能串口DMA,只打开串口,在STM32串口空闲时,跳入串口空闲中断, 先判断数据是否正确,是否接收到24个字节的数据,如果数据校验错误,将缓冲区清零,如果数据正确,关掉串口空闲中断,最后使能串口DMA和DMA。 //串口1中断 //做数据发送结束判断 void USART1_IRQHandler() { uint32_t clear=0; uint8_t i=0; if(USART_GetITStatus(DEBUG_USARTx,USART_IT_IDLE)!=RESET) { //判断数据是否正确 if(DMA_GetCurrDataCounter(DMA1_Channel5)!=24||Check_True_Data()==0) { //数组清零 for(i=0;i<24;i++) { DMA_Recive_Data[i]=0; } } else if(DMA_GetCurrDataCounter(DMA1_Channel5)=

STM32关于systick计时器时间不对的一点问题

☆樱花仙子☆ 提交于 2020-01-10 16:27:33
STM32关于systick计时器时间不对的一点问题 我是新手刚接触STM32,我设定的时间总是实际时间的一半,检查许久也不知道是哪里出了问题 下面是延时函数和计时器的配置 void SysTick_Init(u8 SYSCLK) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_us=SYSCLK/8; fac_ms=(u16)fac_us*1000; } void delay_us(u32 nus) { u32 temp; SysTick->LOAD=nus*fac_us; //时间加载 SysTick->VAL=0x00; //清空计数器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数 do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } void delay_ms(u16 nms) { u32 temp; SysTick->LOAD=(u32)nms*fac_ms; //时间加载(SysTick-

STM32学习笔记之核心板PCB设计

怎甘沉沦 提交于 2020-01-10 10:06:21
  PCB设计流程      PCB规则设置   设计规则的单位跟随画布属性里设置的单位,此处单位是mil。导线线宽最小为10mil;不同网络元素之间最小间距为8mil;孔外径为24mil,孔内径为12mil;线长不做设置;在PCB设计过程中,都要开启“实时规则检测”、“检测元素到覆铜的距离”和“在布线时显示DRC安全边界”功能。      布局原则   布局一般要遵守以下原则:   (1)布线最短原则。例如,集成电路(IC)的去耦电容应尽量放置在相应的VCC和GND   引脚之间,且距离IC尽可能近,使之与VCC和GND之间形成的回路最短。   (2)将同一功能模块集中原则。即实现同一功能的相关电路模块中的元器件就近集中布   局。   (3)遵守“先大后小,先难后易”的原则,即重要的单元电路、核心元器件应优先布局。   (4)布局中应参考原理图,根据电路的主信号流向规律安排主要元器件。   (5)元器件的排列要便于调试和维修,即小元器件周围不能放置大元器件,需调试的元器件周围要有足够的空间。   (6)同类型插件元器件在X或Y方向上应朝一个方向放置。同一种类型的有极性分立元器件也要尽量在X或Y方向上保持一致,便于生产和检验。   (7)布局时,位于电路板边缘的元器件,离电路板边缘一般不小于2mm,如果空间允许,建议距离保持在5mm。   (8)布局晶振时,应尽量靠近IC

stm32 zip gz zlib研究并移植

心已入冬 提交于 2020-01-10 04:56:52
今天,zlib是一种事实上的业界标准,以至于在标准文档中,zlib和DEFLATE常常互换使用。数以千计的应用程序直接或间接依靠zlib压缩函式库,包括: * Linux核心:使用zlib以实作网络协定的压缩、档案系统的压缩以及开机时 解压缩 自身的核心。 * libpng,用于PNG图形格式的一个实现,对bitmap数据规定了DEFLATE作为流压缩方法。 zlib库已经有人移植到RTT上了,并作为RTT的一个组件在可以在建工程的时候添加进去,我的硬件平台是STM32F437II,那个组件仅仅是移植了zlib库,并提供了一个例程,zlib_sample.c,这个例程很重要,我移植gzip zip的时候就是参考这个例程的,里面月很多系统调用,比如fopen(), 在RTT下没有,这是在stdio.h中声明的一个函数,但函数定义找不到,最终与RTT的接口在哪我也不知道,但是可以确实的是在RTT下此函数可以用, 还有很多类似的问题。 估计这个程序初衷就不是让单片机用的,里面充斥的大量的系统定义,类似 #if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) #if defined(USE_FILE32API) #define fopen64 fopen #define ftello64 ftell