如何用c语言编写stm32的程序吗,STM32入门C语言详解
《STM32入門C語言詳解》由會員分享,可在線閱讀,更多相關(guān)《STM32入門C語言詳解(6頁珍藏版)》請?jiān)谌巳宋膸炀W(wǎng)上搜索。
1、最新 料推薦閱讀 flash : 芯片內(nèi)部存儲器flash 操作函數(shù)我的理解 對芯片內(nèi)部flash 進(jìn)行操作的函數(shù),包括讀取,狀態(tài),擦除,寫入等等,可以允許程序去操作flash 上的數(shù)據(jù)。基礎(chǔ)應(yīng)用1 ,FLASH 時(shí)序延遲幾個(gè)周期,等待總線同步操作。推薦按照單片機(jī)系統(tǒng)運(yùn)行頻率,0 24MHz 時(shí),取 Latency=0 ; 24 48MHz 時(shí),取 Latency=1 ;4872MHz時(shí),取 Latency=2 。所有程序中必須的用法: FLASH_SetLatency(FLASH_Latency_2);位置: RCC 初始化子函數(shù)里面,時(shí)鐘起振之后。基礎(chǔ)應(yīng)用2 ,開啟 FLASH 預(yù)讀緩沖功。
2、能,加速FLASH 的讀取。所有程序中必須的用法: FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);位置: RCC 初始化子函數(shù)里面,時(shí)鐘起振之后。3 、閱讀 lib :調(diào)試所有外設(shè)初始化的函數(shù)。我的理解 不理解,也不需要理解。只要知道所有外設(shè)在調(diào)試的時(shí)候,EWRAM需要從這個(gè)函數(shù)里面獲得調(diào)試所需信息的地址或者指針之類的信息。基礎(chǔ)應(yīng)用1 ,只有一個(gè)函數(shù)debug 。所有程序中必須的。用法:#ifdef DEBUGdebug();#endif位置: main 函數(shù)開頭,聲明變量之后。4 、 閱讀 nvic :系統(tǒng)中斷管理。我的理解 管理系。
3、統(tǒng)內(nèi)部的中斷,負(fù)責(zé)打開和關(guān)閉中斷。基礎(chǔ)應(yīng)用1 ,中斷的初始化函數(shù),包括設(shè)置中斷向量表位置,和開啟所需的中斷兩部分。所有程序中必須的。用法:void NVIC_Configuration(void)NVIC_InitTypeDef NVIC_InitStructure; /中斷管理恢復(fù)默認(rèn)參數(shù)#ifdef VECT_TAB_RAM /如果 C/C+ CompilerPreprocessorDefined symbols中的定義了VECT_TAB_RAM(見程序庫更改內(nèi)容的表格)NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); /則在 RAM 調(diào)試#else 。
4、/ 如果沒有定義VECT_TAB_RAMNVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);/則在 Flash 里調(diào)試#endif / 結(jié)束判斷語句/以下為中斷的開啟過程,不是所有程序必須的。/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/設(shè)置 NVIC 優(yōu)先級分組,方式。/注:一共16 個(gè)優(yōu)先級,分為搶占式和響應(yīng)式。兩種優(yōu)先級所占的數(shù)量由此代碼確定,NVIC_PriorityGroup_x 可以是 0、 1、 2 、3 、 4 ,分別代表搶占優(yōu)先級有 1 、2 、 4 、8、 16 個(gè)和響應(yīng)優(yōu)先級有 16。
5、 、8、4 、2 、1 個(gè)。規(guī)定兩種優(yōu)先級的數(shù)量后,所有的中斷級別必須在其中選擇,搶占級別高的會打斷其他中斷優(yōu)先執(zhí)行,而響應(yīng)級別高的會在其他中斷執(zhí)行完優(yōu)先執(zhí)行。/NVIC_InitStructure.NVIC_IRQChannel =中斷通道名 ; /開中斷,中斷名稱見函數(shù)庫/NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /搶占優(yōu)先級/NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /響應(yīng)優(yōu)先級1最新 料推薦/NVIC_InitStructure.NVIC_IRQChan。
6、nelCmd = ENABLE; /啟動(dòng)此通道的中斷/NVIC_Init(&NVIC_InitStructure);中斷初始化5 、閱讀 rcc :單片機(jī)時(shí)鐘管理。我的理解 管理外部、內(nèi)部和外設(shè)的時(shí)鐘,設(shè)置、打開和關(guān)閉這些時(shí)鐘。基礎(chǔ)應(yīng)用1 :時(shí)鐘的初始化函數(shù)過程用法: void RCC_Configuration(void) /時(shí)鐘初始化函數(shù)ErrorStatus HSEStartUpStatus; /等待時(shí)鐘的穩(wěn)定RCC_DeInit(); / 時(shí)鐘管理重置RCC_HSEConfig(RCC_HSE_ON); /打開外部晶振HSEStartUpStatus = RCC_WaitForHSES。
7、tartUp(); /等待外部晶振就緒if (HSEStartUpStatus = SUCCESS)FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/flash讀取緩沖,加速FLASH_SetLatency(FLASH_Latency_2); /flash操作的延時(shí)RCC_HCLKConfig(RCC_SYSCLK_Div1); /AHB使用系統(tǒng)時(shí)鐘RCC_PCLK2Config(RCC_HCLK_Div2); /APB2(高速)為 HCLK的一半RCC_PCLK1Config(RCC_HCLK_Div2); /APB1(低速)為 HC。
8、LK的一半/注:AHB 主要負(fù)責(zé)外部存儲器時(shí)鐘。PB2 負(fù)責(zé) AD ,I/O ,高級 TIM ,串口 1 。APB1 負(fù)責(zé) DA ,USB ,SPI , I2C ,CAN ,串口 2345 ,普通 TIM 。RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /PLLCLK = 8MHz * 9 = 72 MHRCC_PLLCmd(ENABLE); / 啟動(dòng) PLLwhile (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET) /等待 PLL 啟動(dòng)RCC_SYSCLKConfig(RCC_SYSCLKS。
9、ource_PLLCLK); /將 PLL 設(shè)置為系統(tǒng)時(shí)鐘源while (RCC_GetSYSCLKSource() != 0x08) / 等待系統(tǒng)時(shí)鐘源的啟動(dòng)/RCC_AHBPeriphClockCmd(ABP2設(shè)備 1 | ABP2 設(shè)備 2 |, ENABLE); /啟動(dòng) AHP 設(shè)備/RCC_APB2PeriphClockCmd(ABP2設(shè)備 1 | ABP2設(shè)備 2 |, ENABLE);/啟動(dòng) ABP2設(shè)備/RCC_APB1PeriphClockCmd(ABP2設(shè)備 1 | ABP2設(shè)備 2 |, ENABLE); /啟動(dòng) ABP1設(shè)備6 、 閱讀 exti :外部設(shè)備中斷函數(shù)我的。
10、理解 外部設(shè)備通過引腳給出的硬件中斷,也可以產(chǎn)生軟件中斷,19 個(gè)上升、 下降或都觸發(fā)。EXTI0 EXTI15 連接到管腳, EXTI 線 16連接到 PVD (VDD監(jiān)視), EXTI 線 17 連接到 RTC (鬧鐘), EXTI 線 18 連接到 USB (喚醒)。基礎(chǔ)應(yīng)用 1 ,設(shè)定外部中斷初始化函數(shù)。按需求,不是必須代碼。用法: void EXTI_Configuration(void)EXTI_InitTypeDef EXTI_InitStructure; /外部設(shè)備中斷恢復(fù)默認(rèn)參數(shù)EXTI_InitStructure.EXTI_Line =通道 1| 通道 2; / 設(shè)定所需產(chǎn)。
11、生外部中斷的通道,一共19 個(gè)。EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; /產(chǎn)生中斷EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; /上升下降沿都觸發(fā)EXTI_InitStructure.EXTI_LineCmd = ENABLE; /啟動(dòng)中斷的接收2最新 料推薦EXTI_Init(&EXTI_InitStructure); /外部設(shè)備中斷啟動(dòng)7 、 閱讀 dma :通過總線而越過CPU 讀取外設(shè)數(shù)據(jù)我的理解 通過 DMA 應(yīng)用可以加速單片機(jī)外設(shè)、存儲器之間的數(shù)據(jù)傳輸,。
12、并在傳輸期間不影響CPU 進(jìn)行其他事情。這對于入門開發(fā)基本功能來說沒有太大必要,這個(gè)內(nèi)容先行跳過。8 、 閱讀 systic :系統(tǒng)定時(shí)器我的理解 可以輸出和利用系統(tǒng)時(shí)鐘的計(jì)數(shù)、狀態(tài)。基礎(chǔ)應(yīng)用1 ,精確計(jì)時(shí)的延時(shí)子函數(shù)。推薦使用的代碼。用法:static vu32 TimingDelay; /全局變量聲明void SysTick_Config(void) /systick初始化函數(shù)SysTick_CounterCmd(SysTick_Counter_Disable); /停止系統(tǒng)定時(shí)器SysTick_ITConfig(DISABLE); /停止 systick 中斷SysTick_CLKSou。
13、rceConfig(SysTick_CLKSource_HCLK_Div8); /systick使用 HCLK 作為時(shí)鐘源,頻率值除以 8。SysTick_SetReload(9000); /重置時(shí)間 1 毫秒(以 72MHz為基礎(chǔ)計(jì)算)SysTick_ITConfig(ENABLE); /開啟 systic 中斷void Delay (u32 nTime) /延遲一毫秒的函數(shù)SysTick_CounterCmd(SysTick_Counter_Enable); /systic開始計(jì)時(shí)TimingDelay = nTime; /計(jì)時(shí)長度賦值給遞減變量while(TimingDelay != 0。
14、); /檢測是否計(jì)時(shí)完成SysTick_CounterCmd(SysTick_Counter_Disable); /關(guān)閉計(jì)數(shù)器SysTick_CounterCmd(SysTick_Counter_Clear); /清除計(jì)數(shù)值void TimingDelay_Decrement(void) /遞減變量函數(shù),函數(shù)名由 “ stm32f10x_it.c 中的”中斷響應(yīng)函數(shù)定義好了。if (TimingDelay != 0x00) /檢測計(jì)數(shù)變量是否達(dá)到0 TimingDelay-; / 計(jì)數(shù)變量遞減注:建議熟練后使用,所涉及知識和設(shè)備太多,新手出錯(cuò)的可能性比較大。新手可用簡化的延時(shí)函數(shù)代替:void。
15、 Delay(vu32 nCount) /簡單延時(shí)函數(shù)for(; nCount != 0; nCount-); /循環(huán)變量遞減計(jì)數(shù)當(dāng)延時(shí)較長,又不需要精確計(jì)時(shí)的時(shí)候可以使用嵌套循環(huán):void Delay(vu32 nCount) /簡單的長時(shí)間延時(shí)函數(shù) int i; / 聲明內(nèi)部遞減變量3最新 料推薦for(; nCount != 0; nCount-) / 減 量 數(shù) for (i=0; i0xffff; i+) /內(nèi)部循 減 量 數(shù)9 、 閱讀 gpio :I/O 置函數(shù)我的理解 所有 入 出管腳模式 置,可以是上下拉、浮空、開漏、模 、推挽模式, 率特性 2M , 10M ,50M 。也。
16、可以向 管腳直接寫入數(shù)據(jù)和 取數(shù)據(jù)。基 用1 , gpio 初始化函數(shù)。所有程序必 。用法: void GPIO_Configuration(void)GPIO_InitTypeDef GPIO_InitStructure; /GPIO狀 恢復(fù)默 參數(shù)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_ 號| GPIO_Pin_ 號; /管腳位置定 , 號可以是NONE 、 ALL 、 0 至 15 。GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;/ 出速度2MHzGPIO_InitStructure.GPIO_Mod。
17、e = GPIO_Mode_AIN; /模 入模式GPIO_Init(GPIOC, &GPIO_InitStructure); /C組 GPIO 初始化/注:以上四行代 一 , 每 GPIO 屬性必 相同, 默 的 GPIO 參數(shù) :ALL ,2MHz ,FLATING 。如果其中任意一行與前一 相 置相同,那么那一行可以省略,由此推 如果前面已 將此行參數(shù) 定 默 參數(shù)(包括使用 GPIO_InitTypeDef GPIO_InitStructure 代 ),本 用也是默 參數(shù)的 ,那么也可以省略。以下重復(fù) 個(gè) 程直到所有 用的管腳全部被定 完 。基 用2 ,向管腳寫入0 或 1用法: GP。
18、IO_WriteBit(GPIOB, GPIO_Pin_2, (BitAction)0x01); /寫入 1基 用3 ,從管腳 入0 或 1用法: GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)STM32 筆 之七: 它跑起來,基本硬件功能的建立0 、 之前的準(zhǔn) a) 接通串口 接器b) 下 IO 與串口的原廠程序, 通 保 所需硬件正常。1 、 flash ,lib , nvic , rcc 和 GPIO ,基 程序 寫a) 幾個(gè) 函數(shù)中有一些函數(shù)是關(guān)于芯片的初始化的,每個(gè)程序中必用。 保障程序品 ,初學(xué) 段要求 格遵守官方 。注意,官方程序 例程中有個(gè)pl。
19、atform_config.h文件,是 用來指定同 外 中第幾號外 被使用,就是 在main.c 里面所有外 序號用x 代替,比如USARTx ,程序會到 個(gè) 文件中去 找到底是用那些外 ,初學(xué)的 候參考例程 被 個(gè)所迷惑住。b) 全部必用代 取自 函數(shù)所 例程,并增加逐句注 。c) 序 Lib ( debug ), RCC (包括 Flash 化), NVIC , GPIOd) 必用模 初始化函數(shù)的定 :void RCC_Configuration(void); / 定 初始化函數(shù) void GPIO_Configuration(void); / 定 管腳初始化函數(shù) void NVIC_Co。
20、nfiguration(void); / 定 中斷管理初始化函數(shù) void Delay(vu32 nCount); / 定 延 函數(shù)e) Main 中的初始化函數(shù) 用:RCC_Configuration(); / 初始化函數(shù) 用NVIC_Configuration(); /中斷初始化函數(shù) 用4最新 料推薦GPIO_Configuration(); /管腳初始化函數(shù) 用f) Lib 注意事 :屬于Lib 的 Debug 函數(shù)的 用, 放在main 函數(shù)最開始,不要改 其位置。g) RCC 注意事 :Flash 化 理可以不做, 但是兩句也不 也不用改參數(shù) 根據(jù)需要開啟 可以 省 能 率需要根據(jù) 。
21、情況 置參數(shù)h) NVIC 注意事 注意理解占先 先 和響 先 的分 的概念i) GPIO 注意事 注意以后的 程中收集不同管腳 用 的 率和模式的 置。作 高低 平的 I/O ,所需 置: RCC 初始化里面打開 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA);GPIO里面管腳 定:IO 出( 50MHz , Out_PP );IO 入( 50MHz ,IPU );j) GPIO 用GPIO_WriteBit(GPIOB, GPIO_Pin_2, Bit_RESET);/重置GPIO_WriteBit(GPIOB, GPIO_Pin_2, (BitA。
22、ction)0x01);/寫入 1GPIO_WriteBit(GPIOB, GPIO_Pin_2, (BitAction)0x00);/寫入 0GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6) ;/ 入 IOk) 簡單 Delay 函數(shù)void Delay(vu32 nCount)/ 延 函數(shù) for(; nCount != 0; nCount-);步 :RCC 初始化函數(shù)里添加:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , 。
23、ENABLE);不用其他中斷,NVIC 初始化函數(shù)不用改GPIO 初始化代 :/IO 入, GPIOB 的 2 、 10、 11 腳 出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;/管腳號GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; / 出速度GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; / 入 出模式GPIO_Init(GPIOB, &GPIO_InitStructure); /初始化的延 函數(shù):void Delay(vu32 nCount) / 。
24、延 函數(shù) for (; nCount != 0; nCount-); / 循 數(shù)延 完成之后再在main.c 的 while 里面寫一段:GPIO_WriteBit(GPIOB, GPIO_Pin_2, (BitAction)0x01);/寫入 1Delay ( 0xffff ) ;GPIO_WriteBit(GPIOB, GPIO_Pin_2, (BitAction)0x00);/寫入 0Delay ( 0xffff ) ;就可以看到 接在PB2 腳上的 LED 了, 片機(jī)就跑起來了。STM32 筆 之八:來跟PC 打個(gè)招呼,基本串口通 a) 目的:在基 成功的基 上, 串口的 方法 行 踐。
25、。硬件代 利完成之后, 日后 需要用到的 printf 重定 行 ,固定在自己的 函數(shù)中。b) 初始化函數(shù)定 :5最新 料推薦void USART_Configuration(void); /定義串口初始化函數(shù)c) 初始化函數(shù)調(diào)用:void UART_Configuration(void); /串口初始化函數(shù)調(diào)用初始化代碼:void USART_Configuration(void) /串口初始化函數(shù)/串口參數(shù)初始化USART_InitTypeDef USART_InitStructure; /串口設(shè)置恢復(fù)默認(rèn)參數(shù)/初始化參數(shù)設(shè)置USART_InitStructure.USART_BaudRa。
26、te = 9600; /波特率 9600USART_InitStructure.USART_WordLength = USART_WordLength_8b; /字長 8 位USART_InitStructure.USART_StopBits = USART_StopBits_1; /1位停止字節(jié)USART_InitStructure.USART_Parity = USART_Parity_No; /無奇偶校驗(yàn)USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;/無流控制USART_Ini。
27、tStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;/打開 Rx 接收和 Tx發(fā)送功能USART_Init(USART1, &USART_InitStructure); /初始化USART_Cmd(USART1, ENABLE); /啟動(dòng)串口RCC 中打開相應(yīng)串口RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);GPIO 里面設(shè)定相應(yīng)串口管腳模式/串口 1 的管腳初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; /管腳 9GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /復(fù)用推挽輸出GPIO_Init(GPIOA, &GPIO_InitStructure); /TX初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; /管腳 10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure); /RX初始化6。
總結(jié)
以上是生活随笔為你收集整理的如何用c语言编写stm32的程序吗,STM32入门C语言详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 常用数据类型的输入输出
- 下一篇: How To Be Successful