VD. Cấu hình Chân 0 GPIOA hay chân PA0 ở chế độ ouput push -pull max speed 50Mhz, :
- bit 0 và bít 1 chọn chế độ input hoặc output speed bít 2,bit 3 chọn chế dộ chân vd cấu hình chân PA0 ouput max speed 50Mhz và chế độ chân output push - pull thì birt 0
và bit 1 có giá trị 11 bít 2 và bit 3 có giá trị 00 vậy 4 bit cấu hình chân có giá trị 0011 =3 giá trị thập phân:
GPIOA->CRL=(3<<0) ;// giá trị 3=0011(nhị phân) dịch trái 3 bit
- Cấu hinh chân PB1,PB0,PB2,PB3 output push-pull max speed 50 Mhz:
GPIOB->CRL=(3<<0)|(3<<4)|(3<<8)|(3<<12); //chân PB0,PB1,PB2,PB3 output push-pull
-Cấu hình chân PA0,PA1,PA2 input floating: giá trị 4 nhị phân tương ứng của mỗi chân là 0b0100 =4 hệ thập phân
GPIOA->CRL =(4<<0)|(4<<4)|(4<<8);
- Cấu hinh chân PA0,PA1,PA2 input pull down, 4 bit nhị phân tương ứng với chân là 0b1000=8 hệ thập phân
GPIOA->CRL=(8<<0)|(8<<4)|(8<<8);
- Cấu hinh chân PA0,PA1,PA2 input pull up, 4 bit nhị phân tương ứng với chân là 0b1000=8 hệ thập phân
GPIOA->CRL=(8<<0)|(8<<4)|(8<<8);
GPIOA->ODR=(1<<0)|(1<<1)|(1<<2);
3 .Thanh ghi cấp phục vụ cho chế độ input và out put :
a. Thanh ghi xuất dữ liêu( điện áp ra ngoài chân tương ứng )
-GPIOx->ODR (x=A,B,C,D,..G) : thanh ghi 32 bit từ 31 đến bit 16 dự trữ không sử dụng bit 0 đến bit 15 sử dụng cấu hình chân từ 0 đến 15

- Bit tương ưng set lên 1 chân sẽ xuất dữ liệu hay mức điện áp cáo từ chân vi điều khiển ra bên ngoài:
mức 0 chân sẽ ở mức điện áp thâp (0v)
VD. chân từ 7,8,9 của GPIOC được cấu hình ouput push pull giờ mình sẽ xuất ra chân tương ứng mức điện áp cao(3.3V):
GPIOC->ODR=(1<<7)|(1<<8)|(1<<9);
- Để đưa chân tương ứng về mức điện ấp thâp( 0V):
GPIOC->CRL &=~((8<<0)|(8<<4)|(8<<8));
thanh ghi : GPIOx->BSRR : thanh ghi 32 bit các bit 0 đến đến 15 sẽ để set các bit 0 đến 15 của thanh ghi GPIOx->ODR lên 1 các bit 16 đến 31 sử dụng
để reset các bit 0 đến 15 thanh ghi GPIOx->ODR về 0 khi ghi giá trị 1 vào bit tương ưng thanh ghi GPIOx->BSRR nếu ghi giá trị 0 vào bit thanh ghi GPIOx->BSRR thì sẽ không có hiệu lực:
VD. chân từ 7,8,9 của GPIOC được cấu hình ouput push pull giờ mình sẽ xuất ra chân tương ứng mức điện áp cao(3.3V):
GPIOC->BSRR=(1<<7)|(1<<8)|(1<<9);
Để đưa chân tương ứng về mức điện ấp thâp( 0V):
GPIOC->BSRR =(1<<23)|(8<<24)|(8<<25);
2. Đọc trạng thái điện áp của 1 chân input ,thanh ghi GPIOx->IDR(x=A,B,C,...):
- Thanh ghi 32 bit từ bit 31 đến bit 16 dự trư không sử dụng,
từ bit 0 đến 15 sử dụng để đọc điện áp chân cấu hình input từ 0 đên 15 nếu đọc bit có giá trị 1 thi điện áp đầu vào chân có mức điện áp cao
nếu là 0 thi điện áp đầu vào chân là mưc thấp :

- Thanh ghi này chỉ có chức năng đọc chứng ta không thể ghi giá trị vào thanh ghi này :
Giả sử đọc trang thái chân PB5 và giá trị đọc được luu vào biến a:(a có giá trị 1 nếu chân tương ưng có mức điện áp cao còn a=0 thi ngược lại)
uint8_t a;
a=((GPIOB->IDR&(1<<5))>>4);
Giả sử đọc trang thái chân PA6 và giá trị đọc được luu vào biến a:
uint8_t a;
a=((GPIOA->IDR&(1<<6))>>5);
III. Code lập trình mẫu :
Bài 1 : lập trình nhấp nháy 3 led chân PB7,PB8PB9 sử dụng mode output push -pull 50Mhz:
B1. Cấp clock cho phep GPIOB
B2. Cấu hình chân tương ứng ở mode output push -pull 50Mhz
B3. Cấp điện áp chân tương ứng:


- Code STM32F103C8T6 :
#include "Device/Include/stm32f10x.h" // Device header
void gpio_init(void)
{
RCC->APB2ENR=(1<<3);//GPIOB clock enable
GPIOB->CRL=(3<<28);//PB7 ouput push-pull 50Mhz
GPIOB->CRH=(3<<0)|(3<<4);////PB8,PB9 ouput push-pull 50Mhz
}
void delay(volatile uint32_t a )
{
a=a*4000;
while(a--);
}
int main(void)
{
gpio_init();
while(1)
{
GPIOB->ODR=(1<<7)|(1<<8)|(1<<9);//cấp điện áp chân 7,8,9 lên mức cao
delay(500);
GPIOB->ODR&=~((1<<7)|(1<<8)|(1<<9));//Đưa điện áp chân 7,8,9 về 0
delay(500);
}
}
Bai 2: sáng dần 8 led từ chân PB5 ,PB6,PB7,PB8,PB7,PB10,PB11,PB12 :
#include "Device/Include/stm32f10x.h" // Device header
void gpio_init(void)
{
RCC->APB2ENR=(1<<3);//GPIOB clock enable
GPIOB->CRL=(3<<20)|(3<<24)|(3<<28);//PB5,Pb6,P7 ouput push-pull 50Mhz
GPIOB->CRH=(3<<0)|(3<<4)|(3<<8)|(3<<12);////PB8,PB9,PB10,PB11,PB12 ouput push-pull 50Mhz
}
void delay(volatile uint32_t a )
{
a=a*4000;
while(a--);
}
int main(void)
{
gpio_init();
while(1)
{
uint8_t i=0;
for(i=5;i<=12;i++)
{
GPIOB->ODR=(1<<i);//Đưa điện áp chân 5,67,8,9,10,11,12 lên cao
delay(500);
GPIOB->ODR&=~(1<<i);//Đưa điện áp chân 5,67,8,9,10,11,12 về 0
delay(500);
}
}