『壹』 基于stm32的声光报警器设计的意义和价值
摘要 温度,湿度的采集对于仓库,车间,天气,国防和民用等应用领域而言是非常重要的.而温湿度报警装置已被广泛用于基站,电脑房,供电室,藏书楼,生产车间等各种场合. 由于人们对数据采集系统在采集精度,传输速率,功耗以及实时传输方面提出了更高的...
『贰』 STM32 RW问题请教
RW段中存放的一般是静态变量,包括全局静态变量和局部静态变量,初始化或未初始化的。按你描述的,在函数调用的时候,也就是正常运行的时候,这个0x20000044内存值有变化。但是在单步调试的时候,不变。我个人觉得可能是你当前这个跟踪的函数以外,有什么地方改变了它。在全速运行时,花不了多长时间就会发现值变了,但是单步调其实是很慢的,很难复现这个情况。这样,你先查查0x20000044这个是被编译器分配来做什么用的,是不是中断向量表的一部分,还是说是什么静态变量的存储地址。接着再往下查,是静态变量的话,它是什么变量,在代码中查查被哪些地方读写过,有没有可能是被“多线程”方式改变了。另外也比较怀疑是做IAP时有点问题,IAP过程如果用到中断向量表(这几乎是一定要用到的),一定要注意中断向量表重映射的问题,你说的0x20000044和0x20000000很近,0x20000000可能就是你这个STM32
CPU的RAM,重映射中断向量表的时候,一般要重映射到RAM中,不知道是不是IAP相关的代码影响到了这个内存值的变化,注意查查这个问题
『叁』 如何实时跟踪stm32的变量 波形图
用st_link活着jlink进行仿真,在keil软件中仿真可以把变量放在窗口中观测
『肆』 跪求...基于51单片机自动跟踪阳光太阳能热水器控制系统的设计
你还真是挺执着的,呵呵。如果简单一点,可以通过时钟来控制,不过这个有误差,也需要频繁调试。最好的是光线跟踪和集热管移动分开来实现。用体积较小的光敏电阻(放置在金属管里面,类似枪管),加万向移动的马达支架来寻找最佳的角度;角度确定后再启动集热管移动的马达到此位置。移动频率可以设置为一小时移动一次,如果只是在水平方向上移动的话还是有点意义的,否则跟踪本身消耗的的能量太大,就得不偿失了。
『伍』 想用stm32单片机,实现载物旋转并在旋转过程中进行高精度定位,选什么类型电机
直流电机和步进电机都能实现,但因为直流电机无法定位,只能加装一个角度反馈装置进行定位,如旋转正交编码器。步进电机虽然是开环控制,但要是控制得好,不丢步也是可以的。当然最好的选择是 步进电机+角度正交编码器,步进电机比直流电机能更好的控制角度与扭力,角度正交编码器用来反馈高精度角度位置。
『陆』 基于stm32单片机的太阳能跟踪装置的设计
建议:硬件电路包含太阳跟踪传感器、实时时钟芯片、方位/俯仰电机驱动器、方位/俯仰角度反馈机构、单片机最小系统、无线网络模块(可选),单片机软件程序比较简单,太阳跟踪在阳光充足时采用传感器跟踪,阳光不充足时采用计算角度跟踪,太阳落山后角度自动回位。
『柒』 想问一下火焰跟踪装置的设计思路
由于你提供的信息只有“火焰跟踪”几个字,调控对家也不不清楚,只能建议你使用红外传感器获取目标的偏信息,再设计比较电路取得偏移值,用于调节对象。或采用软件图像比较取得偏移值。
『捌』 求助,STM32库函数RCC
看模板中main函数里这么一段代码
int main(void)
{
/*!< At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
file (startup_stm32f10x_xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f10x.c file
*/
也就是说,进入main函数前,系统已经做了时钟配置,调用的是SystemInit()函数,那么我们就进入此函数看过究竟。
void SystemInit (void)
{
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;
/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#ifndef STM32F10X_CL
RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
RCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
RCC->CFGR &= (uint32_t)0xFF80FFFF;
#ifdef STM32F10X_CL
/* Reset PLL2ON and PLL3ON bits */
RCC->CR &= (uint32_t)0xEBFFFFFF;
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x00FF0000;
/* Reset CFGR2 register */
RCC->CFGR2 = 0x00000000;
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x009F0000;
/* Reset CFGR2 register */
RCC->CFGR2 = 0x00000000;
#else
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x009F0000;
#endif /* STM32F10X_CL */
#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
#ifdef DATA_IN_ExtSRAM
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM */
#endif
/* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
/* Configure the Flash Latency cycles and enable prefetch buffer */
SetSysClock();
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif
}
其他的我先都不想管,我就看准了这几句:
/* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
那么就是告诉我们,给HCLK、PCLK1和PCLK2的配置是调用 SetSysClock()函数了。
继续跟进此函数,如下:
static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSE
SetSysClockToHSE();
#elif defined SYSCLK_FREQ_24MHz
SetSysClockTo24();
#elif defined SYSCLK_FREQ_36MHz
SetSysClockTo36();
#elif defined SYSCLK_FREQ_48MHz
SetSysClockTo48();
#elif defined SYSCLK_FREQ_56MHz
SetSysClockTo56();
#elif defined SYSCLK_FREQ_72MHz
SetSysClockTo72();
#endif
/* If none of the define above is enabled, the HSI is used as System clock
source (default after reset) */
}
这其实就告诉我们,SYSCLK的设置就是根据我们定义来设定,如果定义了SYSCLK_FREQ_HSE
,那么SYSCLK就是HSE(默认8MHz),如果定义了SYSCLK_FREQ_24MHz,那么SYSCLK就是24MHz,一次类推。而设置时钟是靠SetSysClockToXX()函数来实现的!
好了,既然这样,我就想继续跟进,去找SetSysClockToXX(),但是惊讶地发现,提示此函数没有定义!为啥,那是因为我去找的刚好是未被编译的,当然找不到定义,事实上这些XX函数都存在在system_stm32f10x.c文件中,但是只有一个能被跟踪找到,那就是对应的宏被定义了的那个。这些定义到底在哪?跟进!得到如下:
//system_stm32f10x.c文件
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE HSE_VALUE */
#define SYSCLK_FREQ_24MHz 24000000
#else
/* #define SYSCLK_FREQ_HSE HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz 24000000 */
/* #define SYSCLK_FREQ_36MHz 36000000 */
/* #define SYSCLK_FREQ_48MHz 48000000 */
/* #define SYSCLK_FREQ_56MHz 56000000 */
#define SYSCLK_FREQ_72MHz 72000000
#endif
这下我想起来了,每次用keil建立工程,总是要求预先定义两个宏:USE_STDPERIPH_DRIVER和STM32F10X_MD,原来这儿就体现出作用了!
因为我的芯片是STM32F10X_MD型,所以SYSCLK就被选择了72MHz!
至于static void SetSysClockTo72(void)此函数到底是怎么把SYSCLK设置成为72MHz的,我懒得去管了,代码很长,也在system_stm32f10x.c文件中,说实话我真没兴趣去搞明白,但要知道,在这个函数里,顺便把HLCK、PCLK1和PCLK2都做了默认设置!
话说回来,我真不想去看寄存器操作的,但是,这个函数里面有一个我认为是ST公司的工程师们大意写错了的地方,如下:
/* HCLK = SYSCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
从时钟布局图中可以知道,PCLK1的最大时钟为36MHz,PCLK1怎么能等于HCLK呢?此时的HCLK可是72MHz,从下面代码也可看到,确实2分频嘛,那就是36MHz,肯定是注释错了!
『玖』 stm32需要仿真器吗
stm32需要一个仿真器。
仿真是项目中必不可少的一步。仿真监控微控制器中各种参数和程序逻辑的执行。
例如,开发了一组逻辑,微控制器的执行与指定的逻辑不一致。此时,需要利用模拟器进行仿真,并通过仿真断点逐步确定误差位置,然后对其进行修改。
(9)stm32火焰跟踪装置电子设计扩展阅读:
模拟器可以替换目标系统中的MCU并操作。
模拟器与实际的目标处理器运行相同,但添加了其他功能,允许您查看MCU中的程序和数据,并通过桌面计算机或其他调试界面控制MCU的操作。
随着集成电路和软件集成平台的快速发展,模拟器不断地给人们带来新的内容和新的挑战,因为它的开发必须与cpu同步,以150mhz的64位总线速度进行跟踪是不可能的。