0. 準備
先用st-link連接stm32核心板與PC,用于燒錄
St-link | Stm32 |
3.3V | 3.3V |
GND | GND |
SWDIO | DIO |
SWCLK | DCLK |
再用USB串口板連接,用于查看串口輸出
USB | Stm32 |
RX | TX(A9) |
TX | RX(A10) |
安裝完成驅動并連接好以后,進入設備管理器可以看到它們都已被識別。
打開putty.exe,選擇串口連接,用于查看之后的串口輸出。
1. 編寫Cube程序,配置UART0為9600,8n1,上電后向串口輸出“Hello”,在PC上通過串口軟件觀察結果;
安裝完成并打開CubeMX軟件,選擇New Project,選擇STM32F103C8Tx并點擊ok。
進入工程界面以后我們可以看到右邊有芯片的引腳圖,如下所示。我們點擊PA11和PA12,選擇GPIO_Input(后面按鈕用)。然后在左邊的配置中將UART1模式定為Half-Duplex。
在生成代碼前,進入工程配置。填寫工程名、保存路徑等,同時選擇IDE為MDK-ARM V5。
設置完成后點擊生成代碼。注意如果沒安裝庫文件的話會提示下載,但通過軟件的自動更新速度無比的慢,而且經常下一半會掛,所以可以在網絡上下載后自助導入。
生成代碼后彈出如下對話框,選擇open。
進入keil5以后可以看到我們的工程文件目錄如左欄所示。注意打開前會彈出Pack installer下載對應的編程工具,選擇stm32f1xx系列即可。下載有點慢,可以自己下載或拷貝他人后導入,路徑為 c:/keil v5/ARM/Pack
然后進入main.c對UART進行配置為9600,8n1,代碼如下所示。
void UART0_Init(UART_HandleTypeDef* UartHandle){
UartHandle->Instance = USART1;
UartHandle->Init.BaudRate = 9600;
UartHandle->Init.WordLength = UART_WORDLENGTH_8B;
UartHandle->Init.StopBits = UART_STOPBITS_1;
UartHandle->Init.Parity = UART_PARITY_NONE;
UartHandle->Init.HwFlowCtl = UART_HWCONTROL_NONE;
UartHandle->Init.Mode = UART_MODE_TX_RX;
HAL_UART_Init(UartHandle);
}
在main函數中填上下面兩行代碼-
UART_HandleTypeDef UartHandle;
UART0_Init(&UartHandle);
以及輸出hello的代碼
HAL_UART_Transmit(&UartHandle, (uint8_t*)”hello\r\n”, 7, 500);
完成代碼后,-準備編譯。選擇flash-設置,進入Utilities標簽,選擇settings,配置如下:
然后F7編譯完成后將程序燒錄至核心板,按一下板子上的reset開關就可以在putty看到串口輸出了。
2. 通過面包板在PA11和PA12各連接一個按鈕開關到地;
3. 編寫Cube程序,配置PA11和PA12為內部上拉到輸入模式,在main()函數循環(huán)檢測PA11按鈕按下,并在按鈕按下時 在串口輸出“Pressed”;
可以在CubeMX中圖形化地更改引腳設置,也可以直接在代碼中修改:
void MX_GPIO_Init(void)
{
……
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
……
}
在while(1)中添加代碼,循環(huán)檢測并輸出
……
if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11))
HAL_UART_Transmit(&UartHandle, (uint8_t*)”Pressed\r\n”, 9, 500);
else
HAL_UART_Transmit(&UartHandle, (uint8_t*)”Not pressed\r\n”, 13, 500);
……
輸出如圖
4. 編寫Cube程序,配置PA12下降沿觸發(fā)中斷,程序中設置兩個全局變量,一個為計數器,一個為標識。當中斷觸發(fā) 時,計數器加1,并設置標識。
在主循環(huán)中判斷標識,如果標識置位則清除標識并通過串口輸出計數值;
在GPIO的init函數中為PIN12設置下降沿中斷,并設置優(yōu)先級。
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
HAL_NVIC_SetPriority(EXTI15_10_IRQn,0,0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
PA12引腳的下降沿觸發(fā)將會觸發(fā)中斷,進入函數EXTI15_10_IRQHandler,此時在函數中調用HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12)表示查看PA12的值,如果符合條件,則觸發(fā)HAL_GPIO_EXTI_Callback函數。代碼如下
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if (GPIO_Pin == GPIO_PIN_12){
PA12flag = 1;
PA12cnt++;
}else{
UNUSED(GPIO_Pin);
}
}
在main函數的while循環(huán)中添加代碼:
if(PA12flag == 1){
PA12flag = 0;
size = sprint(str, ”Count: %d\r\n”,PA12cnt);
HAL_UART_Transmit(&UartHandle, (uint8_t*)str, size, 500);
}
5. 編寫Cube程序,開啟定時器為200ms中斷一次,中斷觸發(fā)時設置標識,主循環(huán)根據這個標識來做串口輸出(取消4 的串口輸出);
使用TIM3定時器,如果不是CUBEMX生成代碼的話記得添加頭文件引用。
添加init函數:
void TIM_Init(){
TIM_Handle.Instance = TIM3;
TIM_Handle.Init.Prescaler = 8000;
TIM_Handle.Init.CounterMode = TIM_COUNTERMODE_UP;
TIM_Handle.Init.Period = 199;
TIM_Handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&TIM_Handle);
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; //設置時鐘源為內部時鐘
HAL_TIM_ConfigClockSource(&TIM_Handle, &sClockSourceConfig);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;//設置復位模式,發(fā)生觸發(fā)輸入事件時計數器和預分頻器能重新初始化
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&TIM_Handle, &sMasterConfig);
HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);//設置優(yōu)先級
HAL_NVIC_EnableIRQ(TIM3_IRQn);enable中斷向量表處理
}
和之前設置的中斷一樣需要覆寫中斷觸發(fā)函數TIM3_IRQHandler,而后在其中對時鐘進行判斷后觸發(fā)HAL_TIM_PeriodElapsedCallback。并在callback中實現操作。
TIM_HandleTypeDef TIM_Handle;
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
int TIMflag = 0, PA12flag = 0;
int TIMcnt = 0, PA12cnt = 0, totalcnt = 0;
void TIM3_IRQHandler(void){
HAL_TIM_IRQHandler(&TIM_Handle);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
TIMflag = 1;
TIMcnt++;
}
6. 編寫完整的碼表程序,PA12的按鈕表示車輪轉了一圈,通過計數器可以得到里程,通過定時器中斷得到的時間可以計算出速度;PA11的按鈕切換模式,模式一在串口輸出里程,模式二在串口輸出速度。
在main函數中實現碼表程序:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(TIMflag == 1){
TIMflag = 0;
if(TIMcnt == 5){每五個周期輸出一次
speed = 2 * PA12cnt / 1;//五個周期為1秒,車輪周長2米
TIMcnt = 0;
if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11))
mode = 1 - mode;//PA11按鈕負責模式切換
switch(mode){
case 0:
size = sprintf(str, "Speed : %f \r\n",speed);//輸出速度
HAL_UART_Transmit(&UartHandle, (uint8_t*)str, size, 500);
break;
case 1:
size = sprintf(str, "Mileage: %d \r\n", 2 * totalcnt);//輸出里程
HAL_UART_Transmit(&UartHandle, (uint8_t*)str, size, 500);
break;
default:break;
}
PA12cnt = 0;
} }
上一篇:STM32高級開發(fā)(14)-使用CubeMX生成STM32工程
下一篇:使用STM32CubeMX開發(fā)一:跑馬燈實驗
推薦閱讀
史海拾趣
- 創(chuàng)業(yè)初期與技術創(chuàng)新
CT Micro公司最初由幾位電子工程領域的專家創(chuàng)立,他們看到了微型計算機斷層掃描(Micro-CT)技術在電子行業(yè)中的巨大潛力。初期,公司面臨著資金短缺和技術難題,但他們通過不斷研發(fā)和創(chuàng)新,成功開發(fā)出了一款具有高性價比的Micro-CT設備,迅速獲得了市場的認可。
- 市場拓展與合作伙伴關系
隨著產品的成熟,CT Micro開始積極尋求市場拓展。他們與多家電子制造企業(yè)建立了合作關系,為這些企業(yè)提供Micro-CT設備的定制服務。通過與這些企業(yè)的合作,CT Micro不僅擴大了市場份額,還進一步提升了產品的技術水平和應用范圍。
- 研發(fā)升級與產品迭代
面對日益激烈的市場競爭,CT Micro不斷投入研發(fā)力量,對Micro-CT設備進行升級和迭代。他們成功推出了多款新型設備,具有更高的分辨率、更快的掃描速度和更低的輻射劑量。這些新產品的推出,進一步鞏固了CT Micro在電子行業(yè)中的領先地位。
- 國際化戰(zhàn)略與市場拓展
隨著國內市場的飽和,CT Micro開始實施國際化戰(zhàn)略。他們積極參與國際展覽和研討會,展示自己的產品和技術實力。同時,他們還在海外設立了銷售和服務中心,為國際客戶提供更加便捷的服務。通過這些努力,CT Micro成功打開了國際市場的大門。
- 社會責任與可持續(xù)發(fā)展
在快速發(fā)展的同時,CT Micro也積極履行社會責任。他們注重環(huán)保和可持續(xù)發(fā)展,采用環(huán)保材料和節(jié)能技術生產產品。此外,他們還積極參與公益事業(yè),為貧困地區(qū)的教育和醫(yī)療事業(yè)貢獻力量。這些舉措不僅提升了公司的社會形象,也為其可持續(xù)發(fā)展奠定了堅實基礎。
請注意,這些故事框架是虛構的,并不代表CT Micro公司的實際發(fā)展情況。如果您需要了解CT Micro公司或類似公司的真實故事,建議您查閱相關公司的官方網站、新聞報道或行業(yè)分析報告。
面對電子行業(yè)日新月異的發(fā)展變化,ETEQ Microsystems Inc始終保持敏銳的市場洞察力。公司不斷調整戰(zhàn)略方向,積極應對行業(yè)變革帶來的挑戰(zhàn)。未來,ETEQ Microsystems Inc將繼續(xù)加大研發(fā)投入,推動技術創(chuàng)新和產品升級,致力于成為電子行業(yè)的領軍企業(yè)。
ETEQ Microsystems Inc一直將品質管理作為公司的核心競爭力之一。公司建立了嚴格的質量管理體系,從原材料采購到產品生產、測試、包裝等各個環(huán)節(jié)都嚴格把控。同時,公司還鼓勵員工積極參與品質改進活動,通過持續(xù)改進不斷提升產品質量和客戶滿意度。
近年來,隨著工業(yè)互聯網和智能制造技術的快速發(fā)展,Hokuriku Electric也加快了數字化轉型的步伐。公司引入先進的自動化設備和智能管理系統(tǒng),實現了生產過程的智能化和精細化管理。通過數字化轉型,Hokuriku Electric不僅提高了生產效率和產品質量,還降低了運營成本和市場風險。同時,公司還積極探索智能制造的新模式和新應用,為電子行業(yè)的未來發(fā)展貢獻智慧和力量。
請注意,以上故事均為基于Hokuriku Electric公司背景和行業(yè)趨勢的虛構內容,旨在展示公司可能的發(fā)展路徑和成就。實際情況可能有所不同。
模塊劃分 模塊劃分的"劃"是規(guī)劃的意思,意指怎樣合理的將一個很大的軟件劃分為一系列功能獨立的部分合作完成系統(tǒng)的需求。C語言作為一種結構化的程序設計語言,在模塊的劃分上主要依據功能(依功能進行劃分在面向對象設計中成為一個錯誤 ...… 查看全部問答∨ |
|
蘋果iPad發(fā)售在即,史蒂夫·喬布斯能否延續(xù)iPhone的輝煌引人關注。這是喬布斯自接受肝移植手術以來在商業(yè)舞臺上的最大動作值此時機,推出《史蒂夫·喬布斯漫長而輝煌的職業(yè)生涯》。 電腦天才 1976年,史蒂夫·喬布斯與拍檔合作創(chuàng)建了蘋果公司。他 ...… 查看全部問答∨ |
|
我的操作如下: AT+CFUN=1 AT+COPS=0 AT+IPR=0 AT+IFC=0,0 AT+CGDCONT=1,\"IP\",\"CMNET\" AT+CGCLASS=\"B\" AT+CGATT=1 AT+CGACT=1 AT$SIMAUTH=\"11111111111111111111111111abcdef\" AT+CMEE=2 AT+CGREG=2 AT+CGACT=1,1 AT+CGPADDR= ...… 查看全部問答∨ |
|
關于STM8S103的AWU和ADC的問題 昨天我試該單片機的awu功能,mcu睡眠醒來后,發(fā)現系統(tǒng)死機,后來經過一步步測試發(fā)現系統(tǒng)在檢測ADC時系統(tǒng)死機。于是我在睡眠醒來后初始話ADC及pwm后,系統(tǒng)是沒有死機,但是這樣的話,我的ADC觸摸按 ...… 查看全部問答∨ |
|
我做的是采集電壓 12864顯示 鍵盤 鍵入并顯示報警值 是4x4鍵盤 鍵盤掃描程序uchar key_in() { uchar keytemp,scancode,tmpcode; &nbs ...… 查看全部問答∨ |
設計資源 培訓 開發(fā)板 精華推薦
- Microchip 升級數字信號控制器(DSC)產品線 推出PWM 分辨率和 ADC 速度業(yè)界領先的新器件
- 意法半導體STM32MP23x:突破成本限制的工業(yè)AI應用核心
- 意法半導體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數
- LGVL配合FreeType為可變字體設置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網頁和arduino的通訊
- ESP32 freeRTOS使用測試
- 480Wh/kg!湖南久森半固態(tài)金屬鋰負極電池即將量產
- 中國首條硫化物固體電解質量產線正式落地
- QUT開發(fā)出新的LENS系統(tǒng) 可以讓機器人進行類似大腦的導航
- 毫米波雷達裝機量分析:毫米波雷達裝車量持續(xù)攀升,大陸和博世占據60%以上市場份額
- TDK推出適用于車載濾波器的同軸電纜供電電感器
- 大摩給“人形機器人100”清單注入新思路
- 行家預判:2025年車載Mini LED反超OLED
- 2025數智未來峰會:深度解讀AI賦能工業(yè)的趨勢與實踐
- 工業(yè)自動化中的Raspberry Pi:簡化經濟實惠的邊緣計算
- 意法半導體宣布擴大在新加坡的“Lab-in-Fab”廠內實驗室合作項目
- 免費體驗業(yè)界最快編譯速度&最好性能 Quartus II v15.0網頁版下載有禮!
- 看視頻贏京東卡 | PI無刷直流電機學習中心正式上線
- 免費申請 | SFH 4713B紅外LED樣片,體驗革新性IR:6技術
- 希望一月 愛上EEWORLD——論壇推廣月
- ADI 新一期《模擬對話》上線,免費下載ing!
- 有獎直播|TI Matter 解決方案助力智能家居創(chuàng)新
- 沁恒CH579M-R1開發(fā)板免費測評,豐富外設等你體驗
- 【EEWORLD第三十六屆】2012年03月社區(qū)明星人物揭曉!
- 閱讀TI工業(yè)應用方案精彩專題,開啟任意寶箱,挑戰(zhàn)答題抽好禮!