You are on page 1of 14

TUTORIAL 02 – HƯỚNG DẪN LẬP TRÌNH GPIO – STM32F - HIENCLUBVN

Hôm nay lại là 1 ngày buồn như cún, chán đời, đi uống rượu ko thành nên
lại ngồi viết bài những gì vừa mới học được. Thôi ko loằng ngoằng nữa vào luôn
vấn đề chính. Let’s Go!

Như đã nói hôm trước, với các dòng SMT32F103xxx có Flash từ 256 đến
512Kb chúng ta đều có thể dùng code cho nhau, và đều chọn khai báo :
USE_STDPERIPH_DRIVER, STM32F10X_HD trong đó : USE STDPERIPH
DRIVER là khai báo sử dụng thư viện, còn STM32F10X_HD là khai báo cho dòng
High density devices (HD). Bao gồm các chíp như hình bên dưới.

- Vậy là chúng ta
có thể dùng code
của con này cho
con khác trong 9
chip trong khung
hình bên.

Chúng ta vẫn tạo thư viện như TUT 01 ko có
gì thay đổi, ở nội dung bài này tôi chỉ đề cập đến vẫn
đề GPIO, các sử dụng hàm, và để viết 1 hàm cho nó
như thế nào cho phù hợp, nội dung đề cập đến 1 khía
cạnh khá nhỏ trong tài nguyên của chip, nhưng nó sẽ
là bước đầu cho những người mới bắt đầu như tôi.
Let’s Go!

* Ý nghĩa và nội dung của Hàm main.c

Nếu để ý các bạn sẽ thấy rằng hàm main.c code rất loằng ngoằng với nhiều
định nghĩa, và việc xem code chia sẽ của người khác, sẽ thấy cũng có khá nhiều
điều khác biệt. Nếu bạn ko hiểu sẽ ko biết có nên dùng hàm này hay ko? Nó có ý
nghĩa gì? Phần này tôi sẽ đi lần lượt

chúng ta sẽ lần lượt xét : GPIO_TypeDef* và GPIO_InitTypeDef* typedef struct { __IO uint32_t CRL. GPIO_InitTypeDef* GPIO_InitStruct) Ở đây đối số vào đều là 2 Pointer (con trỏ). #ifdef USE_FULL_ASSERT void assert_failed(uint8_t* file. nó chỉ dùng để printf lỗi khi biên dịch qua giao thức RS232. __IO uint32_t IDR. nghĩa là chúng ta hoàn toàn có thể khai báo 1 lúc nhiều Pin và Port chỉ trong 1 lệnh. __IO uint32_t ODR. TUTORIAL 02 – HƯỚNG DẪN LẬP TRÌNH GPIO – STM32F . __IO uint32_t BRR. #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) #define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) #define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) #define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) #define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) #define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) . __IO uint32_t BSRR. __IO uint32_t LCKR. Với biến đầu vào là 1 mảng Struct. biến ở đ}y. int main(void) { // CODE HERE ! while (1) { // Công việc chính sẽ nằm ở đ}y. Để hiểu được vấn đề. -> Sử dụng cho việc Debug kiểm tra lỗi. cho các chân mức cao và thấp theo ý muốn của mình thì phải làm như thế nào ? Các hàm nào sẽ thực hiện và việc code ra làm sao ? Việc khai báo 1 cổng được thực hiện bằng hàm : void GPIO_Init(GPIO_TypeDef* GPIOx. __IO uint32_t CRH. // Có cũng được. uint32_t line) { while (1) { } } #endif Chúng ta thấy hàm Main của nó quá đơn giản phải ko nào ? Bây giờ để lập trình được IO. m{ del đi cũng được. } GPIO_TypeDef.h" // Khai b|o thêm thư viện riêng.HIENCLUBVN #include "stm32f10x. khai báo hàm. } } // Phần này không cần quan tâm.

GPIO_Mode_IN_FLOATING = 0x04. TUTORIAL 02 – HƯỚNG DẪN LẬP TRÌNH GPIO – STM32F . GPIO_Speed_50MHz }GPIOSpeed_TypeDef. thực ra là thư viện đã làm cho chúng ta hết rồi. // Tốc độ xung nhịp GPIOMode_TypeDef GPIO_Mode. GPIO_Mode_IPD = 0x28. GPIOC. GPIO_Speed_2MHz. GPIOE. GPIOD. GPIOA.Như đã thấy. typedef enum { GPIO_Mode_AIN = 0x0. // Tên Pin GPIOSpeed_TypeDef GPIO_Speed. GPIO_Mode_AF_OD = 0x1C. GPIO_Mode_Out_OD = 0x14. việc khai báo và gán địa chỉ đã được #define hết rồi. GPIOF. GPIO_Mode_IPU = 0x48. GPIOB. GPIOG. typedef enum { GPIO_Speed_10MHz = 1. GPIO_Mode_AF_PP = 0x18 }GPIOMode_TypeDef. // Chế độ Pin (input / Output) }GPIO_InitTypeDef. GPIO_Mode_Out_PP = 0x10. chỉ cần khai báo dùng cổng nào nữa là xong. .HIENCLUBVN Để ý sẽ thấy các thanh ghi GPIOx đều do thanh ghi Bus APB2 quản lý – 72Mhz #define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) #define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) #define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) #define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) #define GPIOG_BASE (APB2PERIPH_BASE + 0x2000) #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) . Bây giờ mới đến phần quan trọng: GPIO_InitTypeDef* typedef struct { uint16_t GPIO_Pin.

PA2.2.GPIO_Mode = GPIO_Mode_Out_PP. PA6 as input IN_FLOATING */ GPIO_A.6 là Output .HIENCLUBVN #define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */ #define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */ #define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */ #define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */ #define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */ #define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */ #define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */ #define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */ #define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */ #define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */ #define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */ #define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */ #define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */ #define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */ #define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */ #define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */ #define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */ Vậy đến đây xem như chúng ta đã giải quyết xong vấn đề về hàm : void GPIO_Init(GPIO_TypeDef* GPIOx. ở tốc độ 50Mhz. &GPIO_A). GPIO_InitTypeDef* GPIO_InitStruct).Pull GPIO_Init(GPIOA. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA. // Có tên là GPIO_A /* Enable GPIOA clocks */ // Phần cho phép bus APB2 hoạt động ở xung nhịp 72Mhz đến PORT A. PA4.7 là Input và 0. PA7 as output push-pull */ GPIO_A. với các Pin 1. PA5.GPIO_Speed = GPIO_Speed_50MHz. Cũng đơn giản phải ko nào ? Các đối số đã biết hơn rồi.GPIO_Speed = GPIO_Speed_50MHz. // Khởi tạo. // Khởi tạo /* Configure PA0. /* Khai báo 1 biến GPIO_InitTydeDef */ GPIO_InitTypeDef GPIO_A. // Chế độ Output Push . phần này tôi sẽ nói kỹ sau. GPIO_A.3. ENABLE). Các bạn Lưu ý cho mình là phải có dấu & ở hàm: GPIO_Init(GPIOA. &GPIO_A).5. TUTORIAL 02 – HƯỚNG DẪN LẬP TRÌNH GPIO – STM32F . . GPIO_A. /* Configure PA1.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_5 | GPIO_Pin_7. GPIO_A. GPIO_A. PA3. // Chế độ Input IN_Floating GPIO_Init(GPIOA.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_6. 1 ví dụ đơn giản cho bài này chẳng hạn : Khởi tạo 1 Port A. &GPIO_A).4.GPIO_Mode = GPIO_Mode_IN_FLOATING.

void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct). BitAction BitVal). void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface). Ở bên trên là tất cả các hàm đã được định nghĩa. // Cho GPIOA . GPIO_Pin_0)) GPIO_SetBits(GPIOA. uint8_t GPIO_PinSource). . Write phần này thì chắc là quá dễ rồi.h" để xem coi nó gì hót. void GPIO_AFIODeInit(void). uint16_t GPIO_Pin). và sẽ làm những công việc gì ở đây. GPIO_Pin_1))). // Câu lệnh IF được thực hiện khi Pin 0 ở mức Logic Cao. // Cho GPIOA . bây giờ chỉ là vẫn đề sử dụng các hàm Set. phần GPIO_Init xem như đã xong. uint16_t GPIO_Pin). (BitAction)(1 . Read. GPIO_InitTypeDef* GPIO_InitStruct). uint16_t GPIO_Pin).GPIO_ReadOutputDataBit(GPIOA. void GPIO_EXTILineConfig(uint8_t GPIO_PortSource. đến đây còn như phần khởi tạo GPIO đã xong. GPIO_ResetBits(GPIOA. void GPIO_EventOutputCmd(FunctionalState NewState). // Ko chơi được cả mảng đ}u. uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx). GPIO_Pin_2). void GPIO_Init(GPIO_TypeDef* GPIOx. uint16_t GPIO_Pin). GPIO_SetBits(GPIOA. GPIO_Pin_5). mình chủ yếu sẽ sử dụng các hàm trong khung vuông. void GPIO_WriteBit(GPIO_TypeDef* GPIOx. GPIO_ResetBits(GPIOA.HIENCLUBVN Vậy là OK. nên ko cần nói nhiều nữa nhỉ? Chúng ta sẽ vào luôn 1 bài toán cụ thể. GPIO_Pin_2). TUTORIAL 02 – HƯỚNG DẪN LẬP TRÌNH GPIO – STM32F . uint8_t GPIO_PinSource). uint16_t PortVal). void GPIO_ResetBits(GPIO_TypeDef* GPIOx. void GPIO_Write(GPIO_TypeDef* GPIOx. uint16_t GPIO_Pin. GPIO_SetBits(GPIOA. Reset. void GPIO_SetBits(GPIO_TypeDef* GPIOx. GPIO_Pin_3). @defgroup GPIO_Exported_Functions void GPIO_DeInit(GPIO_TypeDef* GPIOx).Pin 5 và Pin 7 ở mức Logic thấp . uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx. void GPIO_PinRemapConfig(uint32_t GPIO_Remap. else GPIO_ResetBits(GPIOA. GPIO_Pin_1. void GPIO_EventOutputConfig(uint8_t GPIO_PortSource. // Muốn nháy Led theo kiểu Toggle. thực sự rất đơn giản và sẽ hiểu. if (GPIO_ReadInputDataBit(GPIOEA. // Kiểm tra xem nếu có t|c động ở Button vị trí GPIOA pin 0 thì GPIOA pin 2 Logic Cao. GPIO_Pin_7).Pin 1 và Pin 3 ở mức Logic cao . chỉ sét 1 câu lệnh như sau : GPIO_WriteBit(GPIODA. // Lần lượt từng cái 1 nhé. void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx. GPIO_Pin_1). uint16_t GPIO_Pin). uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx. FunctionalState NewState). Đến đoạn kế tiếp tôi sẽ đi lần lượt 1 số hàm trong thư viện #include "stm32f10x_gpio. uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx).

i++) { GPIO_WriteBit(GPIOB. // Tất nhiên trước đó chúng ta đ~ phải khởi tạo GPIOB là Output hết rồi. // Tất nhiên trước đó chúng ta đ~ phải khởi tạo GPIOB là Output hết rồi. // Tất nhiên trước đó chúng ta đ~ phải khởi tạo GPIOB là Output hết rồi.. Pin<<i. uint32_t Pin0. ta sẽ đi tìm hiểu lệnh >> và << trong Keil C ARM */ Ở đ}y tôi sẽ chia làm thành 2 thành phần. /* Bây giờ thử 1 lệnh làm sáng lần lượt từ GPIO_Pin_9 đến GPIO_Pin_15 nhé */ for (i = 0. Pin0 << 2 = GPIO_Pin_2.. Pin << 2 = GPIO_Pin_11. /* Bây giờ thử 1 lệnh làm sáng lần lượt từ GPIO_Pin_0 đến GPIO_Pin_8 nhé */ for (i = 0.GPIO_ReadOutputDataBit(GPIOB. Pin0 << 2 = GPIO_Pin_3.. Pin0 << 1 = GPIO_Pin_1. TUTORIAL 02 – HƯỚNG DẪN LẬP TRÌNH GPIO – STM32F . nhưng nếu tiếp tục : 0x001 << 10 = 10000 không giống Pin nào cả. i<=8. // Khai báo 1 biến i thuộc kiểu Unsiged Interger 8 bit để dịch bít. Các bạn thường thấy LED chạy dịch TRÁI. Pin0 <<i). rồi lại dịch PHẢI tuần tự. Phần 1 : Từ Pin 0 đến Pin 8 và Phần 2 : Từ Pin 9 đến Pin 15.. Pin <<i). i++) { GPIO_SetBits(GPIOB. } /* Nếu làm chớp sáng tắt thì liên tục và chạy lần lượt thì theo câu lệnh này*/ for (i = 0. // Gán Pin0 bằng GPIO_Pin_0 ở địa chỉ : 0x0001 // Nếu chúng ta dùng câu lệnh dịch bít sang TRÁI << như thế này : // Pin0 << 0 = GPIO_Pin_0. Vì sao lại thế các bạn sẽ thấy ngay bây giờ.HIENCLUBVN /* Ở phần này là 1 phần khá hay. uint8_t i. Pin << 1 = GPIO_Pin_10. OK. tôi muốn hướng dẫn các bạn xử dụng viêc dịch bít. // Khai báo 1 biến Pin0 Pin0 = GPIO_Pin_0. i<=6. i++) { GPIO_SetBits(GPIOB. Pin<<i))). Pin << 3 = GPIO_Pin_12. // Khai báo 1 biến i thuộc kiểu Unsiged Interger 8 bit để dịch bít. uint32_t Pin. vậy là sai quy luật.. i<=6. } . } Nếu làm dịch từ Pin 9 đến Pin 15 thì sẽ làm như thế này: uint8_t i. (BitAction)(1 .. // Gán Pin0 bằng GPIO_Pin_0 ở địa chỉ : 0x0200 // Nếu chúng ta dùng câu lệnh dịch bít sang TRÁI << như thế này : // Pin << 0 = GPIO_Pin_9. . Nếu Pin 0 ở địa chỉ 0x0001 thì lúc Pin0 << 8 = 0x100 = Pin 8 Nếu để 0x0001 << 9 = 0x200 vẫn bằng Pin 9. Nên từ Pin 0 sẽ dịch từ 0 đến 8 để lần lượt trở th{nh Pin 0 đến Pin 8 và Pin 9 dịch lần lượt từ 0 đến 6 để đượt từ Pin 9 đến Pin 15. . // Khai báo 1 biến Pin Pin0 = GPIO_Pin_9.

// = 10uS <=> quen thuộc từ khi chúng ta học PIC với CCS. đó là những lưu ý trong hàm main.000 void Delay_ms(uint32_t num) { uint32_t index = 0.HIENCLUBVN OK. index != 0. // = 100ms <=> Xây dựng và gọi hàm thế này cho nó tiện. index != 0. TUTORIAL 02 – HƯỚNG DẪN LẬP TRÌNH GPIO – STM32F .c . mà ở đây lại ko? Bỏ chúng có việc sao ko ? Đầu tiên chúng ta thường hay thấy có 1 hàm như thế này. tức giá trị đặt sẽ là : 72. đến đây rồi. tức giá trị đặt sẽ là : 72 void Delay_us(uint32_t num) { uint32_t index = 0. index--) {} } Delay_ms(100). nhiều hàm con các bạn sẽ thấy ở những Project khác có. Bây giờ tôi sẽ đi với các bạn đến phần cuối cùng của nội dung hướng dẫn. // Bây giờ chúng ta sẽ đi xây dựng 1 hàm Delay_ms nhé. index--) {} } // Hàm Delay_us với Độ phân giải sẽ là 1us. // Độ phân giải sẽ là 1ms. /* default system clock is 72MHz */ for(index = (72 * num). /* default system clock is 72MHz */ for(index = (72000 * num). tôi và các bạn sẽ đi tạo 1 hàm Delay nhé và tùy biến nó như thế nào cho phù hợp. v{ nó cũng đ~ quen Delay_us(10). có cần thiết để chạy hàm SystemInit() ? .

Initialize the Embedded Flash Interface.HIENCLUBVN void RCC_Configuration(void) { /* Setup the microcontroller system.arm. mục đích để kiểm tra.s mà ta đ~ Add vào Project trước đó. initialize the PLL and update the SystemFrequency variable. Một cái nữa cũng rất là khó chịu. chúng ta sẽ thấy có 1 H{m để kiểm tra xung nhịp như thế này if (SysTick_Config(SystemCoreClock / 1000)) { while(1).c file */ / Vậy là đ~ quá rõ. while(TimingDelay != 0). TUTORIAL 02 – HƯỚNG DẪN LẬP TRÌNH GPIO – STM32F . . */ SystemInit(). CODE bên www. sẽ rất khó khăn cho mấy bạn vừa mới bắt đầu học về C.vn khá là khó hiểu. void Delay(__IO uint32_t nTime) { TimingDelay = nTime.vn có viết.arm. } void TimingDelay_Decrement(void) { if (TimingDelay != 0x00) { TimingDelay--. Đó l{ hàm Delay của code mẫu www. thiên nhiều về C thuần. To reconfigure the default setting of SystemInit() function. this is done through SystemInit() function which is called from startup file (startup_stm32f10x_xx.s) before to branch to application main. } Thực ra thì cũng ko cần thiết. 1 phần nữa. chúng ta sẽ điểm qua cái này 1 chút. nếu ko đảm bảo thì ko thực hiện công việc gì tiếp theo. } } Chúng ta nên bắt đầu với Hàm Main của tôi đ~ x}y dựng ở trên. void TimingDelay_Decrement(void). refer to system_stm32f10x. } /*!< At this stage the microcontroller clock setting is already configured. static __IO uint32_t TimingDelay. mà lúc trước tôi có đề cập đến đó là sử dụng thanh ghi Bus APB để cấp xung nhịp cho các GPIO . void Delay(__IO uint32_t nCount). chúng ta ko cần phải chạy hàm này nữa. rất cơ bản và dễ hiểu hơn. vì mặc định nó đ~ được chạy trước trong tập tin startup_stm32f10x_hd.

để rõ hơn chúng ta sẽ nhìn ở hình bên dưới.HIENCLUBVN Nhìn vào hình trên chúng ta sẽ thấy để cho các tài nguyên của chip hoạt động thì thông qua BusMatrix sẽ tới AHB (APB2 và APB1) . TUTORIAL 02 – HƯỚNG DẪN LẬP TRÌNH GPIO – STM32F . .

ENABLE). Giả sử cho phép GPIOA thuộc APB2 ở xung nhịp 72Mhz.HIENCLUBVN Vậy muốn sử dụng đến tài nguyên nào thì chúng ta phải cấp xung cho phép nó hoạt động. // Nó thuộc trong thư viện "stm32f10x_rcc.c" mà chúng ta đ~ Add vào Project ở phần trước. ENABLE). @defgroup APB2_peripheral */ #define RCC_APB2Periph_AFIO ((uint32_t)0x00000001) #define RCC_APB2Periph_GPIOA ((uint32_t)0x00000004) #define RCC_APB2Periph_GPIOB ((uint32_t)0x00000008) #define RCC_APB2Periph_GPIOC ((uint32_t)0x00000010) #define RCC_APB2Periph_GPIOD ((uint32_t)0x00000020) #define RCC_APB2Periph_GPIOE ((uint32_t)0x00000040) #define RCC_APB2Periph_GPIOF ((uint32_t)0x00000080) #define RCC_APB2Periph_GPIOG ((uint32_t)0x00000100) #define RCC_APB2Periph_ADC1 ((uint32_t)0x00000200) #define RCC_APB2Periph_ADC2 ((uint32_t)0x00000400) #define RCC_APB2Periph_TIM1 ((uint32_t)0x00000800) #define RCC_APB2Periph_SPI1 ((uint32_t)0x00001000) #define RCC_APB2Periph_TIM8 ((uint32_t)0x00002000) #define RCC_APB2Periph_USART1 ((uint32_t)0x00004000) #define RCC_APB2Periph_ADC3 ((uint32_t)0x00008000) #define RCC_APB2Periph_TIM15 ((uint32_t)0x00010000) #define RCC_APB2Periph_TIM16 ((uint32_t)0x00020000) #define RCC_APB2Periph_TIM17 ((uint32_t)0x00040000) #define RCC_APB2Periph_TIM9 ((uint32_t)0x00080000) #define RCC_APB2Periph_TIM10 ((uint32_t)0x00100000) #define RCC_APB2Periph_TIM11 ((uint32_t)0x00200000) /** Tương tự đối với APB1 @defgroup APB1_peripheral */ #define RCC_APB1Periph_TIM2 ((uint32_t)0x00000001) #define RCC_APB1Periph_TIM3 ((uint32_t)0x00000002) #define RCC_APB1Periph_TIM4 ((uint32_t)0x00000004) #define RCC_APB1Periph_TIM5 ((uint32_t)0x00000008) #define RCC_APB1Periph_TIM6 ((uint32_t)0x00000010) #define RCC_APB1Periph_TIM7 ((uint32_t)0x00000020) #define RCC_APB1Periph_TIM12 ((uint32_t)0x00000040) #define RCC_APB1Periph_TIM13 ((uint32_t)0x00000080) #define RCC_APB1Periph_TIM14 ((uint32_t)0x00000100) #define RCC_APB1Periph_WWDG ((uint32_t)0x00000800) . TUTORIAL 02 – HƯỚNG DẪN LẬP TRÌNH GPIO – STM32F . // 1 lúc nhiều GPIO thì làm sao ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC. // Ví dụ để cho phép GPIOA RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA. #include "stm32f10x_rcc. tiện cho chúng ta muốn sử dụng.h" void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph. FunctionalState NewState). /** Những #define của APB2.

ENABLE).GPIO_A. /* Private variables ---------------------------------------------------------*/ uint8_t i.h" /* Private Function Prototypes -----------------------------------------------*/ void Delay_ms(uint32_t num).com ****************************************************************************** */ #include "stm32f10x.GPIO_D. GPIOC. TUTORIAL 02 – HƯỚNG DẪN LẬP TRÌNH GPIO – STM32F . /* ****************************************************************************** * @CODER: HIENCLUBVN * @PROJECT: GPIO DEMO * @MCU : SMT32F103xC. // /*------------------------------MAIN------------------------------------------*/ int main(void) { /* Enable GPIOA. CSMT32F103xE * * @DATE: 29/06/2013 * @Mail: danghien719@gmail. /* Tien hanh khoi tao chan cho 4 LED sang o muc LOGIC 1*/ .HIENCLUBVN #define RCC_APB1Periph_SPI2 ((uint32_t)0x00004000) #define RCC_APB1Periph_SPI3 ((uint32_t)0x00008000) #define RCC_APB1Periph_USART2 ((uint32_t)0x00020000) #define RCC_APB1Periph_USART3 ((uint32_t)0x00040000) #define RCC_APB1Periph_UART4 ((uint32_t)0x00080000) #define RCC_APB1Periph_UART5 ((uint32_t)0x00100000) #define RCC_APB1Periph_I2C1 ((uint32_t)0x00200000) #define RCC_APB1Periph_I2C2 ((uint32_t)0x00400000) #define RCC_APB1Periph_USB ((uint32_t)0x00800000) #define RCC_APB1Periph_CAN1 ((uint32_t)0x02000000) #define RCC_APB1Periph_CAN2 ((uint32_t)0x04000000) #define RCC_APB1Periph_BKP ((uint32_t)0x08000000) #define RCC_APB1Periph_PWR ((uint32_t)0x10000000) #define RCC_APB1Periph_DAC ((uint32_t)0x20000000) #define RCC_APB1Periph_CEC ((uint32_t)0x40000000) Bên dưới sẽ là toàn bộ CODE để nói lại những gì chúng ta đã học được trong hôm nay. SMT32F103xD. GPIOD clocks */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Peri ph_GPIOE. // Dung de dich BIT uint32_t Pin. /* Private typedef -----------------------------------------------------------*/ GPIO_InitTypeDef GPIO_C. void Delay_us(uint32_t num).GPIO_E.

GPIO_C. // Khoi tao BUTTON tu PE2 -> PE5. GPIO_Pin_6).GPIO_ReadOutputDataBit(GPIOD. i++) { // Sang Lan luot tu PA9 den PA15. else GPIO_ResetBits(GPIOC. GPIO_Pin_13. Sang o muc Logic 1. TUTORIAL 02 – HƯỚNG DẪN LẬP TRÌNH GPIO – STM32F . i++) { // Sang Lan luot tu PA0 den PA8.GPIO_Speed = GPIO_Speed_50MHz. /* 3. GPIO_D. GPIO_Init(GPIOD.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5. Ko nhan thi Tat. Chuong trinh dau tien : Nhan Buton PE2 -> LED PC6 Sang. GPIO_A. GPIO_C. Pin = GPIO_Pin_0. GPIO_A. &GPIO_D). GPIO_Pin_7).GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7.GPIO_Mode = GPIO_Mode_IN_FLOATING.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6| GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15. GPIO_Pin_13))). Delay_ms(100). PD13 as output push-pull */ // <=> 2 LED sang O muc Logic 1. GPIO_Pin_6))). (BitAction)(1 . GPIO_SetBits(GPIOA.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_13. GPIO_Init(GPIOD. PC7 as output push-pull */ // <=> 2 LED sang O muc Logic 1. /* Configure PA0 -> PA15 as output push-pull */ // <=> 16 LED sang O muc Logic 1. GPIO_D. GPIO_Pin_6). (BitAction)(1 . (4 buttons) GPIO_E. // Cho GPIOA o muc Logic 0 het. GPIO_E. Pin << i). &GPIO_E). . else GPIO_ResetBits(GPIOC. /* 2. GPIO_Pin_2)) GPIO_SetBits(GPIOC. GPIO_Pin_6. &GPIO_A). // Tuong tu Noi dung thu 2 : Nhan Button PE3 -> LED PC7 Sang. // Gan cho la Pin 0 for (i = 0.GPIO_Mode = GPIO_Mode_Out_PP. i<=6. GPIO_Pin_3)) GPIO_SetBits(GPIOC. Thoi gian 100ms */ GPIO_WriteBit(GPIOD. if (!GPIO_ReadInputDataBit(GPIOE. Dich Bit TRAI (<<) Sang LED lien tuc tu PA0 den PA15.HIENCLUBVN /* Configure PC6. 0x0000). GPIO_C. GPIO_Init(GPIOE. /* Configure PD6. } Pin = GPIO_Pin_9. GPIO_Pin_7). // Gan cho la Pin 9 for (i = 0. GPIO_Init(GPIOC. Ko nhan thi Tat. // Bat dau chuong trinh TEST Button va Nhay LED. Chuong trinh tiep theo là Nhay 2 LED PD6 và PD13. GPIO_D. */ // Gia su ban dau cac Buttons deu o muc Logic 1. if (!GPIO_ReadInputDataBit(GPIOE.GPIO_ReadOutputDataBit(GPIOD. GPIO_WriteBit(GPIOD. GPIO_E. GPIO_A.GPIO_Speed = GPIO_Speed_50MHz.GPIO_Mode = GPIO_Mode_Out_PP.GPIO_Speed = GPIO_Speed_50MHz. i<=8.GPIO_Mode = GPIO_Mode_Out_PP. &GPIO_C). while (1) { /* 1.GPIO_Speed = GPIO_Speed_50MHz. Sang o Muc Logic 1 */ GPIO_Write(GPIOA.

Pin >> i. /* default system clock is 72MHz */ for(index = (72000 * num). Pin << i. GPIO_WriteBit(GPIOB. file. // Gan cho la Pin 9 for (i = 0. (BitAction)(1 . // Dich Bit PHAI >> } Pin = GPIO_Pin_8. uint32_t line) { /* User can add his own implementation to report the file name and line number. index != 0. /* default system clock is 72MHz */ for(index = (72 * num). ex: printf("Wrong parameters value: file %s on line %d\r\n". Pin << i))). i++) { // Nhap nhay Lan luot tu PA8 den PA0. (BitAction)(1 .GPIO_ReadOutputDataBit(GPIOB.HIENCLUBVN GPIO_SetBits(GPIOA.*/ Pin = GPIO_Pin_15. i++) { // Nhap nhay Lan luot tu PA15 den PA9. TUTORIAL 02 – HƯỚNG DẪN LẬP TRÌNH GPIO – STM32F . index--) {} } /*-----Reports the name of the source file and the source line number----------*/ #ifdef USE_FULL_ASSERT void assert_failed(uint8_t* file.Dich bit PHAI. // Dich Bit PHAI >> } } } /*----------------------------Delay_ms-----------------------------------------*/ void Delay_ms( uint32_t num) { uint32_t index = 0. // Gan cho la Pin 15 for (i = 0. GPIO_WriteBit(GPIOB. i<=6. Pin << i). Phan nay cung tuong tu nhu tren. i<=8. index != 0. nhung Sang nhap nhay tu PA15 tro ve PA0 . line) */ while (1) { } } #endif /******************* (C) HIENCLUBVN . } /* 4.GPIO_ReadOutputDataBit(GPIOB.2013 *****END OF FILE****/ . index--) {} } /*----------------------------Delay_s-----------------------------------------*/ void Delay_us( uint32_t num) { uint32_t index = 0. Pin >> i))).

không theo 1 tài liệu chính thông nào cả.HIENCLUBVN Chân thành cảm ơn các bạn đã theo dõi hướng dẫn. Thân ! Hà Nội. hướng dẫn chỉ do ý hiểu mà viết lại. TUTORIAL 02 – HƯỚNG DẪN LẬP TRÌNH GPIO – STM32F . buồn …… . 29/06/2013 – Trời oi bức. Với kiến thức có hạn và kinh nghiệm hạn chế nên trong tránh khỏi sai và thiếu sót.HIENCLUBVN . mong các bác đóng góp để hoàn thiện.