Author: Cong Neb
Alias: Dark Neb
Studied at: SET BKHN K57
Nếu copy tài liệu: Nhớ ghi nguồn tác giả..Tk
Registers:
__IO uint32_t SR
__IO uint32_t CR1
__IO uint32_t CR2
__IO uint32_t SMPR1
__IO uint32_t SMPR2
__IO uint32_t JOFR1
__IO uint32_t JOFR2
__IO uint32_t JOFR3
__IO uint32_t JOFR4
__IO uint32_t HTR
__IO uint32_t LTR
__IO uint32_t SQR1
__IO uint32_t SQR2
__IO uint32_t SQR3
__IO uint32_t JSQR
__IO uint32_t JDR1
__IO uint32_t JDR2
__IO uint32_t JDR3
__IO uint32_t JDR4
__IO uint32_t DR
Các bước khởi tạo ADC
1. Enable the ADC interface clock using
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADCx, ENABLE);
2. ADC pins configuration
3. Configure the ADC Prescaler, conversion resolution and data alignment using the ADC_Init() function.
4. Activate the ADC peripheral using ADC_Cmd() function.
Các function chính
1.ADC_DeInit
void ADC_DeInit ( void )
Chia sẻ kiến thức Electronic,Coding,Network Security and Telecommunication
Hiển thị các bài đăng có nhãn ARM. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn ARM. Hiển thị tất cả bài đăng
Chủ Nhật, 31 tháng 3, 2019
Thứ Sáu, 15 tháng 3, 2019
[Học ARM-Bài0] RCC STM32 với Standard Peripheral Library
Author: Cong Neb
Alias: Dark Neb
Studied at: SET BKHN K57
Nếu copy tài liệu: Nhớ ghi nguồn tác giả..Tks
Reset and clock control (RCC)
RCC là một khối cực kì quan trọng của MCU... Nếu không có RCC MCU của ta sẽ không khác gì các con IC như 555..ect chứ không còn là MCU nữa...
MCU chỉ làm việc được khi được cung cấp 1 xung Clock... Và RCC làm việc đó...
Nếu nói Nguồn là năng lượng thì RCC là hơi thở của MCU...
Chức năng: Cung cấp xung Clock cho hệ thống...
RCC_TypeDef is defined in the stm32f2xx.h file and contains the RCC registers
Các Registers:
__IO uint32_t CR
__IO uint32_t PLLCFGR
__IO uint32_t CFGR
__IO uint32_t CIR
__IO uint32_t AHB1RSTR
__IO uint32_t AHB2RSTR
__IO uint32_t AHB3RSTR
uint32_t RESERVED0
__IO uint32_t APB1RSTR
__IO uint32_t APB2RSTR
uint32_t RESERVED1
__IO uint32_t AHB1ENR
__IO uint32_t AHB2ENR
__IO uint32_t AHB3ENR
uint32_t RESERVED2
__IO uint32_t APB1ENR
__IO uint32_t APB2ENR
uint32_t RESERVED3
__IO uint32_t AHB1LPENR
__IO uint32_t AHB2LPENR
__IO uint32_t AHB3LPENR
uint32_t RESERVED4
__IO uint32_t APB1LPENR
__IO uint32_t APB2LPENR
uint32_t RESERVED5
__IO uint32_t BDCR
__IO uint32_t CSR
uint32_t RESERVED6
__IO uint32_t SSCGR
__IO uint32_t PLLI2SCFGR
// Mình khác Shock khi lần đầu đọc về các Reg của RCC...Nhiều vch.
Nhưng nó là khối rất quan trọng của MCU nên ta phải tìm hiểu nó...
Alias: Dark Neb
Studied at: SET BKHN K57
Nếu copy tài liệu: Nhớ ghi nguồn tác giả..Tks
Reset and clock control (RCC)
RCC là một khối cực kì quan trọng của MCU... Nếu không có RCC MCU của ta sẽ không khác gì các con IC như 555..ect chứ không còn là MCU nữa...
MCU chỉ làm việc được khi được cung cấp 1 xung Clock... Và RCC làm việc đó...
Nếu nói Nguồn là năng lượng thì RCC là hơi thở của MCU...
Chức năng: Cung cấp xung Clock cho hệ thống...
RCC_TypeDef is defined in the stm32f2xx.h file and contains the RCC registers
Các Registers:
__IO uint32_t CR
__IO uint32_t PLLCFGR
__IO uint32_t CFGR
__IO uint32_t CIR
__IO uint32_t AHB1RSTR
__IO uint32_t AHB2RSTR
__IO uint32_t AHB3RSTR
uint32_t RESERVED0
__IO uint32_t APB1RSTR
__IO uint32_t APB2RSTR
uint32_t RESERVED1
__IO uint32_t AHB1ENR
__IO uint32_t AHB2ENR
__IO uint32_t AHB3ENR
uint32_t RESERVED2
__IO uint32_t APB1ENR
__IO uint32_t APB2ENR
uint32_t RESERVED3
__IO uint32_t AHB1LPENR
__IO uint32_t AHB2LPENR
__IO uint32_t AHB3LPENR
uint32_t RESERVED4
__IO uint32_t APB1LPENR
__IO uint32_t APB2LPENR
uint32_t RESERVED5
__IO uint32_t BDCR
__IO uint32_t CSR
uint32_t RESERVED6
__IO uint32_t SSCGR
__IO uint32_t PLLI2SCFGR
// Mình khác Shock khi lần đầu đọc về các Reg của RCC...Nhiều vch.
Nhưng nó là khối rất quan trọng của MCU nên ta phải tìm hiểu nó...
[Học ARM-Bài2] GPIO STM32 với Standard Peripheral Library
Author: Cong Neb
Alias: Dark Neb
Studied at: SET BKHN K57
Nếu copy tài liệu: Nhớ ghi nguồn tác giả..Tks
Các Register của GPIO
__IO uint32_t MODER
__IO uint32_t OTYPER
__IO uint32_t OSPEEDR
__IO uint32_t PUPDR
__IO uint32_t IDR
__IO uint32_t ODR
__IO uint16_t BSRRL
__IO uint16_t BSRRH
__IO uint32_t LCKR
__IO uint32_t AFR
Các steps để sử dụng GPIO Driver...
1. Enable the GPIO AHB clock (RCC: Reset Control Clock)
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx,ENABLE);
GPIOx: Port mà bạn muốn sử dụng.... Eg : GPIOA/GPIOC...etc
Alias: Dark Neb
Studied at: SET BKHN K57
Nếu copy tài liệu: Nhớ ghi nguồn tác giả..Tks
Các Register của GPIO
__IO uint32_t MODER
__IO uint32_t OTYPER
__IO uint32_t OSPEEDR
__IO uint32_t PUPDR
__IO uint32_t IDR
__IO uint32_t ODR
__IO uint16_t BSRRL
__IO uint16_t BSRRH
__IO uint32_t LCKR
__IO uint32_t AFR
Các steps để sử dụng GPIO Driver...
1. Enable the GPIO AHB clock (RCC: Reset Control Clock)
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx,ENABLE);
GPIOx: Port mà bạn muốn sử dụng.... Eg : GPIOA/GPIOC...etc
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.
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.
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ứ Sáu, 3 tháng 11, 2017
Hướng dẫn sửa chữa chip do cấu hình Debug sai (cho STM32)
Hướng dẫn sửa chữa chip do cấu hình Debug sai (cho STM32)
Nếu như bạn không thể nạp được chip lần nữa sau lần nạp đầu tiên thì tức là bạn đã không cấu hình Debug (hoặc cấu hình sai). Khi đó chip sẽ mặc định chân PA13 và PA14 không phải là chân nạp chip theo chuẩn SWD nữa nên mọi hoạt động cố gắng nạp cho chip lúc này trở nên vô ích.
Rất may vẫn có cách để khắc phục sự cố này, bạn có thể làm theo các bước sau:
B1: Tạo lại chương trình của bạn bằng STM32CubeMX và lần này cấu hình đúng như trong hướng dẫn nạp chip.
B2: Sau khi tạo lại code trên trình biên dịch (Keilv5 hoặc IAR for STM32) bạn biên dịch chương trình đó.
B3: Trước khi cắm lại mạch nạp, bạn phải cắm jump nối vào BOOT0 và BOOT1. Sau đó bạn cắm mạch nạp vào máy tính.
Trong trường hợp bạn dùng kit khác bạn phải đảm bảo chân BOOT0 phải được cấp mức 1 vào BOOT1 (PB2) phải cấp mức 0 như bảng dưới đây (có thể tham khảo chi tiết hơn trong “Reference Manual” của chip )
B4: Lúc này chip sẽ chạy ở trong vùng nhớ System của chip.
Do chip đã truy cập vào vùng nhớ System nên không có khả năng truy cập vào vùng nhớ Flash (chứa chương trình của bạn) nữa nên bạn hoàn toàn có thể nạp lại chương trình của bạn trong chế độ này.
B5: Sau khi bạn nạp xong chương trình với cấu hình đúng, bạn phải rút mạch nạp ra và gỡ jump nối ở BOOT0 và BOOT1 để chip có thể truy cập lại vào vùng nhớ Flash.
B6: Cắm lại mạch nạp và bạn có thể thấy chương trình của bạn lúc này đã hoạt động và bạn có thể nạp lại chương trình.
Chúc các bạn thành công.
Nếu như bạn không thể nạp được chip lần nữa sau lần nạp đầu tiên thì tức là bạn đã không cấu hình Debug (hoặc cấu hình sai). Khi đó chip sẽ mặc định chân PA13 và PA14 không phải là chân nạp chip theo chuẩn SWD nữa nên mọi hoạt động cố gắng nạp cho chip lúc này trở nên vô ích.
Rất may vẫn có cách để khắc phục sự cố này, bạn có thể làm theo các bước sau:
B1: Tạo lại chương trình của bạn bằng STM32CubeMX và lần này cấu hình đúng như trong hướng dẫn nạp chip.
B2: Sau khi tạo lại code trên trình biên dịch (Keilv5 hoặc IAR for STM32) bạn biên dịch chương trình đó.
B3: Trước khi cắm lại mạch nạp, bạn phải cắm jump nối vào BOOT0 và BOOT1. Sau đó bạn cắm mạch nạp vào máy tính.
Trong trường hợp bạn dùng kit khác bạn phải đảm bảo chân BOOT0 phải được cấp mức 1 vào BOOT1 (PB2) phải cấp mức 0 như bảng dưới đây (có thể tham khảo chi tiết hơn trong “Reference Manual” của chip )

B4: Lúc này chip sẽ chạy ở trong vùng nhớ System của chip.
Do chip đã truy cập vào vùng nhớ System nên không có khả năng truy cập vào vùng nhớ Flash (chứa chương trình của bạn) nữa nên bạn hoàn toàn có thể nạp lại chương trình của bạn trong chế độ này.
B5: Sau khi bạn nạp xong chương trình với cấu hình đúng, bạn phải rút mạch nạp ra và gỡ jump nối ở BOOT0 và BOOT1 để chip có thể truy cập lại vào vùng nhớ Flash.
B6: Cắm lại mạch nạp và bạn có thể thấy chương trình của bạn lúc này đã hoạt động và bạn có thể nạp lại chương trình.
Chúc các bạn thành công.
[Học ARM-Học STM32] Nạp code cho chip STM32
Nạp code cho chip STM32-Boot cho Chip STM32
B1: Nối các chân 3.3V,RST, GND từ mạch nạp ST-Link vào các chân tương ứng ở trên kit. Với chân TCK , TMS trên mạch nạp các bạn nối tương ứng với chân SWCLK, SWDIO trên kit.
B2.Tạo ra chương trình nạp code cho chip. Các bạn có thể làm chương trình “Blink Led”.
Chú ý:
Với những bạn không sử dụng kit STM32F4 Discovery(Kit này nạp qua cổng USB), ở mục Pinout (phần điều chỉnh ngoại vi của chip) các bạn phải vào mục SYS (màu xanh) và chọn ở trong thanh kéo Debug là “Serial Wire” nếu không chip của bạn sẽ chỉ có thể nạp 1 lần được thôi.
Ví dụ nếu bạn dùng chip STM32F103C8 bạn chỉnh như hình:
Sau khi chỉnh mode Debug như trên chân PA13 và PA14 sẽ hiện như hình:
Nếu bị sự cố (vô tình không thực hiện như mục ở trên) bạn có thể khắc phục như sau: Khắc phục nạp sai
B2.Tạo ra chương trình nạp code cho chip. Các bạn có thể làm chương trình “Blink Led”.
Chú ý:
Với những bạn không sử dụng kit STM32F4 Discovery(Kit này nạp qua cổng USB), ở mục Pinout (phần điều chỉnh ngoại vi của chip) các bạn phải vào mục SYS (màu xanh) và chọn ở trong thanh kéo Debug là “Serial Wire” nếu không chip của bạn sẽ chỉ có thể nạp 1 lần được thôi.
Ví dụ nếu bạn dùng chip STM32F103C8 bạn chỉnh như hình:
Sau khi chỉnh mode Debug như trên chân PA13 và PA14 sẽ hiện như hình:
Nếu bị sự cố (vô tình không thực hiện như mục ở trên) bạn có thể khắc phục như sau: Khắc phục nạp sai
B3: Cắm mạch nạp vào máy tính để tiến hành quá trình nạp.
Note:
Tuy nhiên có những trường hợp do chân swd clk và swd io bạn đã remap cho nó thực hiện chức năng khác và ko còn nạp chương trình được nữa. Lúc đó cần dùng tới chân reset. Và khi chân reset cũng bị remap nốt thì lúc này bạn phải nạp qua bootloader. Lúc này mới cần thiết lập chân boot.
Nạp code cho chip sử dụng môi trường MDK-ARM (KeilC) :
Chú ý,cấu hình Max Clock trong phần Setting của: ST-Link Debugger là 4MHZ nhé.
Port thì bạn dùng gì bạn cấu hình như vậy.
Một số bạn không có Max Clock là 4Mhz là do cấu hình của ST-Link Debugger đã cũ các bạn phải Update nó:
Các bạn theo đường dẫn:Keil C 5\ARM\STLink chạy
ST-LinkUpgrade là được nhé.
Một số trường hợp nạp code cho KIT/Chip qua mạch nạp không được,ta phải bootloader cho nó:Nạp thông qua UART như sau:
Chuẩn bị: Kit STM32
USB UART to TTL (PL2003,FT232...vv)
Bước 1.Kiểm tra driver UART TTL xem có chưa,chưa có các bạn cài đặt nhé
tùy loại mà có driver riêng.
Bước 2. Cài đặt phần mềm Flash Loader Demonstrator của ST:
Bước 3. Kết nối
Các bạn chú ý: Chân RX của kit STM sẽ nối với chân TX của Module chuyển đổi.
Chân TX của kit STM sẽ nối với chân RX của Module chuyển đổi
GND-GND
VCC-VCC (Chú ý,một số module chuyển đổi USB to TTL có VCC=5V thì bạn phải lắp mạch chia áp dùng 2 điện trở là được 3.3V)
Còn lại các bạn tự làm nhé,nó rất dễ thôi.Chúng ta nên tự mò mẫm thì kinh nghiệm mới nhanh lên được.Thân !
Thứ Ba, 31 tháng 10, 2017
Ngắt trong STM32 là gì?

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.
Đăng ký:
Bài đăng (Atom)