Hiển thị các bài đăng có nhãn vi dieu khien. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn vi dieu khien. Hiển thị tất cả bài đăng

Thứ Tư, 9 tháng 1, 2019

[Học ARM] Lập trình GPIO In/Out của vi điều khiển – STM32

General-purpose Input/Output (GPIO) rất phổ biến, là một chức năng ngoại vi cơ bản của mỗi loại vi điều khiển, bao gồm các chân đầu vào và chân đầu ra, có thể được điều khiển bởi người dùng. Nó tương tự với các dòng vi điều khiển 8bit như AVR hoặc PIC. Không giống như những dòng vi điều khiển 8bit, chỉ có 8 chân IO trên 1 port thì ở các vi điều khiển 32bit, có đến 16 chân IO trên 1 port. Cụ thể đối với chip STM32F103C8Tx gồm có 3 Port chính đó là GPIOA, GPIOB, GPIOC. Không phải tất cả các port đều có 16 chân, chỉ riêng GPIOA, GPIOB trên kit thì có đủ 16 chân GPIO.

Tiếp theo chúng ta đến phần cấu trúc 1 chân GPIO của chip:



Có 2 khối điều khiển khác nhau (khung hình nét đứt) như ở hình trên

– Output

– Input và các điều khiển đầu ra khác

Chức năng của GPIO bao gồm:




Bài viết này sẽ hướng dẫn về chức năng Output states: Output push-pull. Sau đây sẽ là sơ lược về cấu trúc phần cứng và khối điều khiển Output.


1. Các thanh ghi dữ liệu:

Bit set/reset register:

Ở mỗi chân general-purpose I/O port đều có 2 thanh ghi cấu hình 32 bit (GPIOx_CRL, GPIO_CRH: Control Register High, Control Register Low):

– Thanh ghi 32 bit dùng để set/reset các bit ở các chân IO (GPIOx_BSRR: Bit Set Reset Register)

– Thanh ghi 16 bit reset các bit ở các chân IO (GPIOx_BRR: Bit Reset Register) với x là các port của vi điều khiển.

Output data register:

Dữ liệu sau khi các bit đã được set/reset ở thanh ghi trên sẽ được truyền sang thanh ghi dữ liệu đầu ra 32bit (GPIOx_ODR: Output data register) và truyền đến khối điều khiển để xuất mức tín hiệu cho chân IO. Ngoài ra đối với thanh ghi này, chúng ta có thể đọc dữ liệu để xem trạng thái hiện tại của các chân IO đang ở mức “1” hoặc mức “0”.

2.Cách xuất mức tín hiệu output thông qua khối CMOS:

Ở push-pull mode:

Cấu hình chân I/O là ngõ ra, khi output control = 0 thì P-MOS sẽ dẫn, chân I/O sẽ nối VDD, còn khi output control = 1 thì N-MOS dẫn, chân I/O được nối VSS.

Khi ghi các bit Reset vào thanh ghi GPIOx_BSRR hoặc GPIOx_BRR dữ liệu sẽ được truyền sang thanh ghi output và đẩy tới khối điều khiển. Đầu ra của P-MOS sẽ là mức 1 vì ở trước P-MOS có 1 cổng đảo tín hiệu và N-MOS sẽ là mức 0, thì lúc này P-MOS sẽ được kích và chân IO có tín hiệu mức “1”:



Ngược lại, khi ghi các bit Set vào thanh ghi GPIOx_BSRR dữ liệu sẽ được truyền sang thanh ghi output và đẩy tới khối điều khiển. Đầu ra của P-MOS sẽ là mức 0 vì ở trước P-MOS có 1 cổng đảo tín hiệu và N-MOS sẽ là mức 1, thì lúc này N-MOS sẽ được kích và chân IO có tín hiệu mức “0”:



Chúng ta sẽ sử dụng CubeMX để sinh code và lập trình trên môi trường KeilC-V5. Khi sinh code, chúng ta sẽ làm việc dựa trên lớp thư viện HAL-Hardware Abstraction Layerr. Thư viện này được xây dựng dựa trên các thư viện tiêu chuẩn (Std) của STM32, để tiếp cận được nhanh chóng dòng vi điều khiển này thì chúng ta sẽ không đi quá sâu vào việc set/reset các bit ở trong thanh ghi. Mà sử dụng phần mềm CubeMX để sinh code và sử dụng các hàm GPIO có sẵn trong thư viện HAL.

Thứ Ba, 31 tháng 10, 2017

Ngắt trong STM32 là gì?


Image result for stm32

Ngắt trong vi điều khiển STM32 là gì?
Interrupt là gì?

Xin chào các bạn,sau đây mình xin giới thiệu chức năng ngắt trong STM32
Giống như Timer,Ngắt là một module rất quan trọng của STM32,sử dụng ngắt giúp chúng ta không phải mất thời gian kiểm tra liên tục đoạn chương trình nào đó,ngoài ra chúng ta có thể sử dụng ngắt để đồng thời cho STM32 cùng 1 lúc làm"nhiều nhiệm vụ" .

Khi điều kiện ngắt xảy ra,vi điều khiển sẽ tạm dừng chương trình đang thực hiện để nhảy tới chương trình ngắt,sau khi thực hiện xong chương trình ngắt,STM32 tiếp tục thực hiện các chương trình trước đó đang làm.

Chú ý:Chương trình ngắt không có đối số truyền vào và cũng không được gọi trực tiếp từ hàm main() hay một chương trình con khác.

Để hiểu rõ hơn về Ngắt(Interrupt) chúng ta cùng xem ví dụ sau:

void main() {
while(1) {
LED1=1;
delay_ms(1000);
LED1=0;
delay_ms(1000);

if(button)
LED2=1;
else
LED2=0;
}
}

Chúng ta có thể thấy: LED1 sẽ luôn nhấp nháy mỗi 1s.
Khi ta bấm nút (button) thì LED2 đôi khi sẽ không sáng.Nguyên nhân là sao? Do trong ngôn ngữ C/C++ các hàm đều thực hiện theo nguyên tắc tuần tự (Từ trên xuống dưới):
Giả sử hàm main () đang thực hiện lệnh:
LED1=1;
delay_ms(1000);
Lúc này,dù ta có bấm nút thì LED2 cũng sẽ không sáng do chương trình đang trong hàm delay_ms().

Để khắc phục,ta phải sử dụng Ngắt(Interrupt).
Ở bài sau mình sẽ hướng dẫn các bạn cách sử dụng Ngắt trong STM32.

XIn cảm ơn,hẹn gặp lại.