流水灯闪烁(c语言)
生活随笔
收集整理的這篇文章主要介紹了
流水灯闪烁(c语言)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
一、實驗初始化
地址映射和寄存器映射
1. 總線基地址
2. 外設基地址
3. 外設寄存器地址?
4.接線
5.程序下載
二、用C語言寄存器實現流水燈?
1.main.c
2.加入設備
3.編譯生成hex文件
4.實驗結果?
3.實驗總結?
4.參考
一、實驗初始化
地址映射和寄存器映射
1. 總線基地址
| 總線名稱? | 總線基地址?? | ?相對外設基地址的偏移 |
| APB1? | 0x4000 0000 | 0x0 |
| APB2? | 0x4001 0000? | 0x0001 0000 |
| AHB | 0x4001 8000 | 0x0001 8000 |
2. 外設基地址
| 外設名稱 | 外設基地址 | 相對 APB2 總線的地址偏移 |
| GPIOA? ? | 0x4001 0800 | 0x0000 0800 |
| GPIOB ? | 0x4001 0C00 | 0x0000 0C00 |
| GPIOC? | ?0x4001 1000 | 0x0000 1000 |
| GPIOD | 0x4001 1400 | 0x0000 1400 |
| GPIOE | 0x4001 1800 | 0x0000 1800 |
| GPIOF | 0x4001 1C00 | 0x0000 1C00 |
| GPIOG | 0x4001 2000 | 0x0000 2000 |
3. 外設寄存器地址?
本次實驗要用到GPIOA,GPIOB,GPIOC。查表可知
| 寄存器名稱 | 寄存器地址 | 相對GPIOA基址的偏移 |
| GPIOA_CRL? | 0x4001 0800 | 0x00 |
| GPIOA_CRH | 0x4001 0804 | 0x04 |
| GPIOA_IDR | 0x4001 0808? | 0x08 |
| GPIOA_ODR? | 0x4001 080C | 0x0C |
| GPIOA_BSRR | 0x4001 0810 | 0x10 |
| GPIOA_BRR | 0x4001 0814 | 0x14 |
| GPIOA_LCKR | 0x4001 0818 | 0x18 |
4.接線
(1)將串口USB轉TTL線與stm32核心板連接如圖所示
?(2)設.BOOT0 與 BOOT1 配置啟動方式。?
BOOT1=x ? ?BOOT0=0 ? ?從用戶閃存啟動,這是正常的工作模式。?
BOOT1=0 ? ?BOOT0=1 ? ?(ISP方式)從系統存儲器啟動,這種模式啟動的程序功能由廠家設置。
BOOT1=1 ? ?BOOT0=1 ? ?從內置SRAM啟動,這種模式可以用于調試.
如下圖箭頭所示
5.程序下載
??燒錄文件的時候要按一下reset。
二、用C語言寄存器實現流水燈?
1.main.c
代碼
#define RCC_AP2ENR *((unsigned volatile int*)0x40021018)//----------------GPIOA配置寄存器 ------------------------ #define GPIOA_CRH *((unsigned volatile int*)0x40010804) #define GPIOA_ORD *((unsigned volatile int*)0x4001080C) //----------------GPIOB配置寄存器 ------------------------ #define GPIOB_CRL *((unsigned volatile int*)0x40010C00) #define GPIOB_ORD *((unsigned volatile int*)0x40010C0C) //----------------GPIOC配置寄存器 ------------------------ #define GPIOC_CRH *((unsigned volatile int*)0x40011004) #define GPIOC_ORD *((unsigned volatile int*)0x4001100C) //-------------------簡單的延時函數----------------------- void Delay_ms( volatile unsigned int t) {unsigned int i;while(t--)for (i=0;i<800;i++); } //------------------------主函數-------------------------- int main() {int j=100;RCC_AP2ENR|=1<<2; //APB2-GPIOA外設時鐘使能RCC_AP2ENR|=1<<3; //APB2-GPIOB外設時鐘使能 RCC_AP2ENR|=1<<4; //APB2-GPIOC外設時鐘使能//這兩行代碼可以合為 RCC_APB2ENR|=1<<3|1<<4;GPIOA_CRH&=0xFFF0FFFF; //設置位 清零 GPIOA_CRH|=0x00020000; //PA12推挽輸出GPIOA_ORD|=1<<12; //設置初始燈為亮GPIOB_CRL&=0xFFFFFF0F; //設置位 清零 GPIOB_CRL|=0x00000020; //PB1推挽輸出GPIOB_ORD|=1<<1; //設置初始燈為滅GPIOC_CRH&=0xF0FFFFFF; //設置位 清零GPIOC_CRH|=0x02000000; //PC14推挽輸出GPIOC_ORD|=1<<14; //設置初始燈為滅 while(j){ GPIOA_ORD=0x1<<12; //PA12高電平 Delay_ms(3000000);GPIOA_ORD=0x0<<12; //PA12低電平Delay_ms(3000000);GPIOB_ORD=0x1<<1; //PB1高電平 Delay_ms(3000000);GPIOB_ORD=0x0<<1; //PB1低電平Delay_ms(3000000);GPIOC_ORD=0x1<<14; //PC14高電平 Delay_ms(3000000);GPIOC_ORD=0x0<<14; //PC14低電平Delay_ms(3000000);} }2.加入設備
3.編譯生成hex文件
4.實驗結果?
3.實驗總結?
本次實驗是前面幾個實驗的提高,接入硬件,使led燈閃爍,短短的幾秒鐘背后有著復雜的過程,只能照貓畫虎。知識還有不足,繼續學習、提高。
4.參考
stm32花式點流水燈
STM32寄存器的簡介、地址查找,與直接操作寄存器
基于匯編和C語言STM32流水燈依次閃爍
總結
以上是生活随笔為你收集整理的流水灯闪烁(c语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用cmd控制台编译java文件和运行cl
- 下一篇: Biperpedia: An Ontol