『壹』 基於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位匯流排速度進行跟蹤是不可能的。