日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀] 0. 準備先用st-link連接stm32核心板與PC,用于燒錄St-linkStm323.3V3.3VGNDGNDSWDIODIOSWCLKDCLK再用USB串口板連接,用于查看串口輸出USBStm32RXTX(A9)TXRX(A10)安裝完成驅動并連接好以后,進入設備管理

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。



設置完成后點擊生成代碼。注意如果沒安裝庫文件的話會提示下載,但通過軟件的自動更新速度無比的慢,而且經(jīng)常下一半會掛,所以可以在網(wǎng)絡上下載后自助導入。

生成代碼后彈出如下對話框,選擇open。



進入keil5以后可以看到我們的工程文件目錄如左欄所示。注意打開前會彈出Pack installer下載對應的編程工具,選擇stm32f1xx系列即可。下載有點慢,可以自己下載或拷貝他人后導入,路徑為 c:/keil v5/ARM/Pack


然后進入main.c對UART進行配置為9600,8n1,代碼如下所示。


  1. voidUART0_Init(UART_HandleTypeDef*UartHandle){

  2. UartHandle->Instance=USART1;

  3. UartHandle->Init.BaudRate=9600;

  4. UartHandle->Init.WordLength=UART_WORDLENGTH_8B;

  5. UartHandle->Init.StopBits=UART_STOPBITS_1;

  6. UartHandle->Init.Parity=UART_PARITY_NONE;

  7. UartHandle->Init.HwFlowCtl=UART_HWCONTROL_NONE;

  8. UartHandle->Init.Mode=UART_MODE_TX_RX;

  9. HAL_UART_Init(UartHandle);

  10. }


在main函數(shù)中填上下面兩行代碼-


  1. UART_HandleTypeDefUartHandle;

  2. UART0_Init(&UartHandle);



以及輸出hello的代碼


  1. HAL_UART_Transmit(&UartHandle,(uint8_t*)”hellorn”,7,500);


完成代碼后,-準備編譯。選擇flash-設置,進入Utilities標簽,選擇settings,配置如下:



然后F7編譯完成后將程序燒錄至核心板,按一下板子上的reset開關就可以在putty看到串口輸出了。



2. 通過面包板在PA11和PA12各連接一個按鈕開關到地;



3. 編寫Cube程序,配置PA11和PA12為內部上拉到輸入模式,在main()函數(shù)循環(huán)檢測PA11按鈕按下,并在按鈕按下時 在串口輸出“Pressed”;

可以在CubeMX中圖形化地更改引腳設置,也可以直接在代碼中修改:


  1. voidMX_GPIO_Init(void)

  2. {

  3. ……

  4. GPIO_InitStruct.Mode=GPIO_MODE_INPUT;

  5. GPIO_InitStruct.Pull=GPIO_PULLUP;

  6. ……

  7. }

在while(1)中添加代碼,循環(huán)檢測并輸出


  1. ……

  2. if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11))

  3. HAL_UART_Transmit(&UartHandle,(uint8_t*)”Pressedrn”,9,500);

  4. else

  5. HAL_UART_Transmit(&UartHandle,(uint8_t*)”Notpressedrn”,13,500);

  6. ……


輸出如圖



4. 編寫Cube程序,配置PA12下降沿觸發(fā)中斷,程序中設置兩個全局變量,一個為計數(shù)器,一個為標識。當中斷觸發(fā) 時,計數(shù)器加1,并設置標識。

在主循環(huán)中判斷標識,如果標識置位則清除標識并通過串口輸出計數(shù)值;

在GPIO的init函數(shù)中為PIN12設置下降沿中斷,并設置優(yōu)先級。


  1. GPIO_InitStruct.Pin=GPIO_PIN_12;

  2. GPIO_InitStruct.Mode=GPIO_MODE_INPUT;

  3. GPIO_InitStruct.Pull=GPIO_PULLUP;

  4. GPIO_InitStruct.Mode=GPIO_MODE_IT_FALLING;

  5. HAL_NVIC_SetPriority(EXTI15_10_IRQn,0,0);

  6. HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

  7. HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);


PA12引腳的下降沿觸發(fā)將會觸發(fā)中斷,進入函數(shù)EXTI15_10_IRQHandler,此時在函數(shù)中調用HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12)表示查看PA12的值,如果符合條件,則觸發(fā)HAL_GPIO_EXTI_Callback函數(shù)。代碼如下


  1. voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin){

  2. if(GPIO_Pin==GPIO_PIN_12){

  3. PA12flag=1;

  4. PA12cnt++;

  5. }else{

  6. UNUSED(GPIO_Pin);

  7. }

  8. }


在main函數(shù)的while循環(huán)中添加代碼:


  1. if(PA12flag==1){

  2. PA12flag=0;

  3. size=sprint(str,”Count:%drn”,PA12cnt);

  4. HAL_UART_Transmit(&UartHandle,(uint8_t*)str,size,500);

  5. }




5. 編寫Cube程序,開啟定時器為200ms中斷一次,中斷觸發(fā)時設置標識,主循環(huán)根據(jù)這個標識來做串口輸出(取消4 的串口輸出);

使用TIM3定時器,如果不是CUBEMX生成代碼的話記得添加頭文件引用。

添加init函數(shù):


  1. voidTIM_Init(){

  2. TIM_Handle.Instance=TIM3;

  3. TIM_Handle.Init.Prescaler=8000;

  4. TIM_Handle.Init.CounterMode=TIM_COUNTERMODE_UP;

  5. TIM_Handle.Init.Period=199;

  6. TIM_Handle.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;

  7. HAL_TIM_Base_Init(&TIM_Handle);

  8. sClockSourceConfig.ClockSource=TIM_CLOCKSOURCE_INTERNAL;//設置時鐘源為內部時鐘

  9. HAL_TIM_ConfigClockSource(&TIM_Handle,&sClockSourceConfig);

  10. sMasterConfig.MasterOutputTrigger=TIM_TRGO_RESET;//設置復位模式,發(fā)生觸發(fā)輸入事件時計數(shù)器和預分頻器能重新初始化

  11. sMasterConfig.MasterSlaveMode=TIM_MASTERSLAVEMODE_DISABLE;

  12. HAL_TIMEx_MasterConfigSynchronization(&TIM_Handle,&sMasterConfig);

  13. HAL_NVIC_SetPriority(TIM3_IRQn,0,0);//設置優(yōu)先級

  14. HAL_NVIC_EnableIRQ(TIM3_IRQn);enable中斷向量表處理

  15. }


和之前設置的中斷一樣需要覆寫中斷觸發(fā)函數(shù)TIM3_IRQHandler,而后在其中對時鐘進行判斷后觸發(fā)HAL_TIM_PeriodElapsedCallback。并在callback中實現(xiàn)操作。


  1. TIM_HandleTypeDefTIM_Handle;

  2. TIM_ClockConfigTypeDefsClockSourceConfig;

  3. TIM_MasterConfigTypeDefsMasterConfig;

  4. intTIMflag=0,PA12flag=0;

  5. intTIMcnt=0,PA12cnt=0,totalcnt=0;

  6. voidTIM3_IRQHandler(void){

  7. HAL_TIM_IRQHandler(&TIM_Handle);

  8. }

  9. voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){

  10. TIMflag=1;

  11. TIMcnt++;

  12. }

6. 編寫完整的碼表程序,PA12的按鈕表示車輪轉了一圈,通過計數(shù)器可以得到里程,通過定時器中斷得到的時間可以計算出速度;PA11的按鈕切換模式,模式一在串口輸出里程,模式二在串口輸出速度。

在main函數(shù)中實現(xiàn)碼表程序:

  1. while(1)

  2. {

  3. /*USERCODEENDWHILE*/

  4. /*USERCODEBEGIN3*/

  5. if(TIMflag==1){

  6. TIMflag=0;

  7. if(TIMcnt==5){每五個周期輸出一次

  8. speed=2*PA12cnt/1;//五個周期為1秒,車輪周長2米

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關閉