14. OPTION BYTES TRONG STM8S

OPTION BYTES TRONG STM8S.

14. OPTION BYTES TRONG STM8S.

  1. CƠ SỞ LÝ THUYẾT.
  2. Option byte trong STM8S003 phục vụ một số chức năng riêng biết được liệt kế như sau:

    • ROP(Memory Readout protection) : Mục đích của chức năng này là sẽ khóa code, không cho phép đọc ngược, bảo vệ chương trình tránh khỏi tình trạng copy source code cũng như flash đè code. Trong trường hợp đã write ROP option byte là ON thì chúng ta chỉ có thể write ROP off và flash đè code khác xuống MCU, không thể đọc lại được code(nhà sản xuất có cách nào chưa công bố thì mình không biết).
    • UBC[0:7] : Config size cho bootloader. Một số ứng dụng cần update Firmware theo version chúng ta sẽ cần viết bootloader và application cho nó, các bit này sẽ hữu dụng khi chuyển vector ngắt đến địa chỉ mà application bắt đầu cũng như bảo vệ code cho vùng bootloader. Phần config này sẽ hữu dụng khi chúng ta sử dụng STVD và có nhược điểm vùng nhớ application bắt đầu phải chẵn và chia hết cho 64(Không config linh động được địa chỉ bắt đầu của application). Trong IAR sẽ có một số cách để config bootloader mà k cần sử dụng đến option này, các bạn có thể tham khảo thêm với IAR ở đây : http://laptrinharmst.blogspot.com/2021/11/bai-15-bootloader-stm8s-tren-iar.html và file AN2659.
    • AFR[0:7]: Config cho Alternate function. Như các bạn đã biết mỗi chân vi điều khiển có thể có nhiều chức năng khác nhau,để linh hoạt trong việc config các chức năng này nhà sản xuất đã thêm tính năng để việc sử dụng chân điều khiển linh hoạt hơn. Ví dụ: Chân PC5 của STM8S003 có chức năng mặc định sẽ là SPI tạo xung clock, ngoài ra nó cũng là chân Timer2 chanel1, để sử dụng tính năng timer chúng ta bắt buộc phải write thêm bit config AFR0. Chức năng khác nhau của config này các bạn có thể tham khảo thêm trong datasheet.
    • HSITRIM : config độ phân giải cho bộ xung clock HIS.
    • LSI_EN : config cho phép bộ dao động LSI như là bộ cung cấp clock chính cho MCU.
    • IWDG_HW, WWDG_HW, WWDG_HALT : cho phép bộ independent watchdog, window watchdog hoạt động 1 cách tự động sau khi cấp nguồn hay không.
    • EXTCLK: cho phép sử dụng thạch anh ngoài hay không.
    • CKAWUSEL : config low-speed clock source cho bộ AWU(Analog wakeup) lấy từ LSI hay HSE.
    • PRSC : đi chung với config CKAWUSE, nếu lấy từ HSE thì tương ứng với tỷ lệ chia.
    • HSECNT[0:7] : config thời gian để bộ dao động ngoại được ổn định trước khi vận hành, option này sẽ sử dụng EXTCLK on.

    Về mặt lí thuyết chúng ta có thể nạp option byte mỗi lần flash code theo tool nạp tuy nhiên khi viết chương trình bootloader hoặc một số mục đích khác chúng ta có thể dùng các tập lệnh trong thư viện flash để ghi các option byte này mà k cần sử dụng tool nạp. Vùng nhớ của các option tương ứng với bảng bên dưới.

  3. Ví dụ với Option byte.
  4. Ví dụ: viết chương trình sử dụng TIM2_CH3 chớp tắt led với chu kì 1s,duty cycle là 50% trên chân PD2, sử dụng dụng tính năng ghi flash để ghi các byte option mà không cần dùng tool. Chân PD2 có chức năng TIM2_CH3, tuy nhiên nó là Aternate function, cần write option byte mới sử dụng được nếu không chỉ còn cách flash lại các option byte.

    1. Cấu hình bộ nhớ Flash.
    2. Chú ý việc cấu hình ở đây sẽ tương tự như việc cấu hình ghi vào EEPROM.

    3. Cấu hình bộ Timer 2.
    4. Ghi các option byte.
    5. Sử dụng STVP để nạp chương trình mà k cần ghi các option byte.
    6. Kết quả thu được sẽ là led trên chân PD2 sẽ chớp tắt với chu kì 1s(0.5s sáng và 0.5s tắt). Chúc các bạn thành công.

Link tải ví dụ với option bytes ở trên.

13. FLASH và EEPROM TRONG STM8S.

FLASH và EEPROM TRONG STM8S.

FLASH và EEPROM TRONG STM8S.

  1. Cơ Sở Lý Thuyết.
  2. Chào các bạn, Hôm nay mình sẽ tiếp tục một số tìm hiểu về Flash và EEPROM.Chúng là 2 vùng nhớ khác nhau trong STM8S, tuy nhiên về cấu tạo và bản chất thì tương đối giống nhau. Tổng quan về bộ nhớ của của STM8S.

    Bảng thống kê dưới đây sẽ so sánh một số thông tin chung giữa 2 loại:

    Bộ nhớ Flash sử dụng các cổng logic NAND nên giá thành sẽ rẻ hơn, tốc độ truy cập cũng sẽ chậm hơn, bộ nhớ Flash thường truy cập theo khối trong khi EEPROM thì là byte, chức năng tương ứng cũng khác nhau. Ở STM8S003 thì bộ nhớ Flash(8k byte) dùng để lưu trữ chương trình trong khi EEPROM(128 bytes) thì thường dùng để lưu một số thông tin không xóa sau khi Flash hoặc mất điện. Với những thông tin bạn không muốn mất sau khi Flash Firmware mới và tốc độ truy cập cao thì thường chúng ta sẽ sử dụng bộ nhớ EEPROM, ngược lại nhưng thông số thay đổi mỗi lần Flash, tốc độ truy cập thông thường và khối lượng data lớn thì chúng ta sẽ sử dụng bộ nhớ Flash.

  3. Ví dụ với bộ nhớ Flash.
  4. Ví dụ: Ghi data vào 16 byte cuối cùng của bộ nhớ Flash với địa chỉ 0x9FF0 -> 0x9FFF data tương ứng từ 0 -> 15, Sau khi đọc lại data đã ghi, nếu đúng đèn led trên chân PD3 sẽ sáng, ngược lại nếu ghi bị failed hoặc read bị failed thì đèn ở chân PD3 sẽ tắt.

    Cách thức kiểm tra: các bạn sẽ dùng mạch nạp stlink_v2 + phần mềm “ST Visual Programmer” để đọc lại toàn bộ vùng nhớ và kiểm tra data thuộc địa chỉ từ 0x9FF0 -> 0x9FFF.

    1. Config bộ nhớ Flash.
    2. Trước khi thực hiện đọc ghi vào vùng nhớ Flash, chúng ta cần thực hiện một số config quan trọng như: Deinit lại toàn bộ vùng nhớ, Cài đặt thời gian xử lí, đồng thời mở khóa vùng nhớ. “FLASH_MEMTYPE_PROG” tương ứng với việc chọn vùng nhớ Flash để giao tiếp.

    3. Thực thi code giao tiếp với bộ nhớ Flash
    4. Trước tiên chúng ta sẽ ghi data với giá trị từ 0 -> 15 vào địa chỉ bắt đầu từ 0x9FF0 -> 0x9FFF(16 bytes). Đợi 1 khoảng thời gian nhỏ để chắc chắn rằng việc ghi đã thực thi xong, tiếp đến chúng ta sẽ đọc lại và kiểm tra vùng nhớ đã ghi, nếu chỉ cần 1 địa chỉ sai thì sẽ thoát quá trình đọc. Nếu kết quả ghi vào đọc lại giống nhau thì đèn led trên chân PD3 sẽ sang, ngược lại thì tắt.

      Chú ý: Để thao tác với vùng nhớ Flash thì chúng ta cần chú ý rằng code của quá trình biên dịch k được tràn vào vùng nhớ cần đọc/ghi. Ngoài lệnh đọc/ghi thông thường chúng ta có thể sử dụng đọc/ghi các block(IN_RAM trong thư viện) để với mục đích nâng cao tốc độ tương tác khi thao tác với số lượng data lớn.

    5. Kết quả thực thi.
    6. Sau khi dùng stlink_V2 và phần mềm “ST Visual Programmer” để đọc lại toàn bộ vùng nhớ, kết quả sẽ như hình bên dưới.

  5. Ví dụ với bộ nhớ EEPROM.
  6. Ví dụ: ghi data vào 16 byte cuối cùng của bộ nhớ Flash với địa chỉ 0x4000 -> 0x400F data tương ứng từ 0 -> 15, Sau khi đọc lại data đã ghi, nếu đúng đèn led trên chân PD3 sẽ sáng, ngược lại nếu ghi bị failed hoặc read bị failed thì đèn ở chân PD3 sẽ tắt. Cách thức kiểm tra: các bạn sẽ dùng mạch nạp stlink_v2 + phần mềm “ST Visual Programmer” để đọc lại toàn bộ vùng nhớ và kiểm tra data thuộc địa chỉ từ 0x4000 -> 0x400F.

    Tương tự như bộ nhớ Flash, giao tiếp với EEPROM cũng tương tự, chỉ khác cấu hình và địa chỉ.

    1. Config bộ nhớ EEPROM.
    2. Thực thi code giao tiếp với bộ nhớ Flash.
    3. Kết quả.
    4. Note : ngoài lệnh Read/Write , chúng ta còn một số lệnh như xóa, ghi 1 word… Các bạn có thể tham khảo trong file stm8s_flash.c và áp dụng thử cho project của mình. Bộ nhớ EEPROM của STM8S003 chỉ là 128 bytes tức là bắt đầu từ 0x4000 ->0x407F.

Link tải ví dụ với bộ nhớ flash. Link tải ví dụ giao tiếp với EEPROM

Bài 15: Bootloader STM8S với IAR.

Bài 15: Bootloader STM8S với IAR.

Bài 15: Bootloader STM8S với IAR.

Chào các bạn, hôm nay mình sẽ hướng dẫn các bạn một số bước và lưu ý để viết chương trình code bootloader và application cho STM8S.

  1. Bootloader và Application là gì.
  2. Để hiểu về bootloader, trước tiên bạn cần hiểu thứ tự thực thi code và vùng nhớ của vi điều khiển, ở đây là STM8S003F3P6. Với MCU này thì bộ nhớ Flash(bộ nhớ lưu trữ code) sẽ là 8Kbyte, và địa chỉ lưu code sẽ là từ 0x00 8000 đến 0x00 9FFF. Chương trình cũng sẽ load từ địa chỉ 0x00 8000 đến 0x00 9FFF và khi bị reset thì MCU cũng sẽ load chương trình theo thứ tự này.

    Bootloader là một ứng dụng được lập trình sẵn dụng để cập nhật Firmware cho các MCU mà không cần tới mạch nạp. Bootloader sử dụng một trong các chuẩn truyền thông có sẵn(One wire, UART, USB, SPI, CAN, I2C …) để cập nhật lại bộ nhớ flash giúp thực thi các ứng dụng một cách linh hoạt hơn. Bootloader và Application thường sử dụng cho các sản phẩm có phần giao tiếp như Bluetooth, wifi, usb, Rs232, zigbee, rs232… Ví dụ : bạn muốn cập nhật Firmware từ xa cho một sản phẩm mà không cần tháo dỡ phần cứng hoặc không cần đến tận nơi có phần cứng đó.

    • Bootloader là phần code được viết sẵn và nạp trong một vùng nhớ flash cố định, code này hầu như không thay đổi và hoạt động phải ổn định(bạn cứ tưởng tượng bootloader cho một sản phẩm đã bán đến khách hàng mà update FW bị lỗi và phải thu hồi về để nạp lại bootloader thì hơi chuối…).Code này thường chiếm ít dung lượng của bộ nhớ vì mục đích của nó chỉ dung để cập nhật Firmware và cung cấp một số ít thông tin cần thiết. phần code này thường được nạp bằng mạch nạp(debugger) và nạp một lần duy nhất trước khi Release.
    • Application Firmware là phần code Firmware sẽ thường xuyên thay đổi, ví dụ sản phẩm có tính năng A, người dùng muốn thêm tính năng B, giả sử phần cứng của bạn đã hỗ trợ tính năng B, bạn chỉ cần viết thêm phần code của tính năng B và update lại Application FW thông qua phần code Bootloader.

    Tùy thuộc từng dự án và mục đích sử dụng bộ nhớ flash sẽ chia làm nhiều phần khác nhau. Ở đây, mình ví dụ STM8S003F3P6 sẽ chia code bootloader là 2kbyte, và application sẽ là 5.75kbyte, config sẽ là 0.25kbyte. Thì sơ đồ vùng nhớ flash sẽ như sau:

    • Bootloader : phần này sẽ chứa code của bootloader, mục đích chính để update FW, code build cho phần phải nhỏ hơn 2 kbyte. Tùy thuộc vào khả năng viết code và ứng dụng nó sẽ có dung lượng khác nhau, size code của phần này càng nhỏ càng tốt, để tiết kiệm vùng nhớ cho Application.
    • Aplication : vùng nhớ này sẽ chứa code thay đổi theo từng version và chiếm dung lượng lớn nhất. Size của code buid ra không được vượt quá dung lượng quy định là 5.75 kbyte.
    • Config : vùng này sẽ chứa thông số config như version bootloader, phần bảo mật để cho phép upload code khi có yêu cầu, các thông số hoạt động cần thiết cho bootloader…

    Lưu đồ giải thuật của việc sử dụng bootloader và application như sau :

  3. Một số điểm lưu ý khi viết chương trình bootloader và application.
  4. Ở đây mình viết bootloader và application bằng IAR cho STM8, một số lưu ý khi viết chương trình như sau:

    1. Làm sao để nhảy từ vùng nhớ application sang bootloader và ngược lại.
      • Nhảy tới vùng nhớ application từ code bootloader : Chúng ta sẽ sử dụng ngôn ngữ máy để nhảy tới địa chỉ mong muốn, ở đây vùng nhớ application của mình bắt đầu từ 0x00 8800(tương ứng bootloader từ 0x00 8000 -> 0x00 87FF = 2Kbyte). Lệnh để nhảy tới tương ứng là asm("JPF $8800").
      • Nhảy tới vùng nhớ bootloader từ application: Vùng nhớ bootloader được quy định bắt đầu từ 0x00 8000 nên việc nhảy tới vùng nhớ này tương ứng với việc reset MCU(thường là soft reset). Có nhiều cách để reset MCU, ở đây mình dùng cho phép Independent watchdog(IWDG) hoạt động và chờ cho đến khi bộ IWDG tràn, lúc này MCU sẽ được reset. Cú pháp như sau:
      • IWDG->KR = IWDG_KEY_ENABLE; while (1); // Wait until reset occurs from IWDG

    2. Chuyển đổi các vector ngắt khi chương trình thực thi ở vùng nhớ application.
    3. Địa chỉ các vector ngắt mặc định bắt đầu từ 0x82000000, khi chuyển sang vùng nhớ application chúng ta cũng phải chuyển đổi vector ngắt để khi nhảy tới vùng nhớ application ngắt vẫn thực thi bình thường và không còn thực thi ở vùng nhớ bootloader. Mình có search việc thực thi này và tham khảo một số page khác. Vector ngắt của mình sẽ bắt đầu địa chỉ 0x82008800. Việc config sẽ thực thi ở code bootloader và khai báo như sau:

      __root const long reintvec[]@".intvec"= { 0x82008080,0x82008804,0x82008808,0x8200880c, 0x82008810,0x82008814,0x82008818,0x8200881c, 0x82008820,0x82008824,0x82008828,0x8200882c, 0x82008830,0x82008834,0x82008838,0x8200883c, 0x82008840,0x82008844,0x82008848,0x8200884c, 0x82008850,0x82008854,0x82008858,0x8200885c, 0x82008860,0x82008864,0x82008868,0x8200886c, 0x82008870,0x82008874,0x82008878,0x8200887c, };

    4. Cấu hình IDE để thay đổi địa chỉ bắt đầu build khác địa chỉ mặc địnhs 0x00 8000.
    5. Trong config của iar có thể thay đổi địa chỉ build bắt đầu việc load file .icf, file này có chức năng cấu hình vùng nhớ, eeprom, stack heap size…. File mặc định nếu chưa cấu hình gì sẽ nằm trong thư mục cài đăt iar. Ở trên máy của mình sẽ là C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\config\lnkstm8s003f3.icf với MCU sử dụng là STM8S003F3P6.

      Việc đổi địa chỉ tiến hành như sau: copy file .icf tương ứng với project bạn sử dụng vào trong thư mục chứa project, sửa địa chỉ mong muốn rồi lưu lại.

      Vào config project và chỉnh sửa lại link đến file .icf vừa thêm.

    6. Tăng tốc độ xóa và ghi trong bộ nhớ flash.
    7. Bình thường chúng ta sẽ sử dụng các function có sẵn trong thư viện “stm8s_flash” để thao tác với bộ nhớ flash, tuy nhiên tốc độ thực thi của chúng khá chậm, nhà sản xuất của đã hỗ trợ một số function khác dùng RAM để thực thi(chứa IN_RAM ở đầu function), tốc độ này nhanh hơn nhiều lần so với các function thông thường, tuy nhiên nó sẽ tiêu tốn RAM của vi điều khiển. Nếu sử dụng không tốt có thể dẫn tới treo vi điều khiển. Các function thao tác với flash cũng nằm trong file thư viện “stm8s_flash”. Để sử dụng tính năng này chúng ta phải define trong chương trình, bạn có thể sử dụng 1 trong 2 cách sau:

      • Define trực tiếp trong thẻ config:
      • Hoặc bỏ command trong file stm8s.h.
    8. Tối ưu code để code bootloader chiếm dung lượng nhỏ nhất.
      • Tối ưu thuật toán, biến để giảm dung lượng code nhỏ nhất.
      • Ví dụ: Các biến toàn cục có giá trị tối đa là 255 thì chỉ nên sử dụng uint8_t không nên sử dụng uint16_t hay uint32_t.

      • Sử dụng thanh ghi thay thế cho các function viết sẵn: Bạn có thể xem chi tiết các function, xóa bỏ các define kiểm tra tính safety code, sử dụng các thanh ghi trong chính function con để giảm size code. Chúng ta chỉ nên modify các function này khi cần tối ưu code flash, nếu còn nhiều bộ nhớ thì không nên modify function của nhà sản xuất vì nó sẽ giảm độ an toàn cũng như hiệu năng của code.
      • Ví dụ: Một function Init_GPIO sẽ có chi tiết các code như sau:

        Khi các bạn đã xác định rõ chân GPIO là chân input/output, interrupt/none interrupt, pull up/push pull thì không cần if else và bỏ đi đoạn check safety code. Code được viết lại như sau :

      • Tối ưu phép tính toán xor, or, and … với các giá trị tương đồng.
      • Ví dụ: Các phép toán or với giá trị 0 thì nên được xóa đi ví dụ: CLK->CKDIVR |= (uint8_t)CLK_PRESCALER_HSIDIV1; với define CLK_PRESCALER_HSIDIV1 = (uint8_t)0x00. Phép tính sẽ là CLK->CKDIVR |= 0x00; -> giá trị thanh ghi này không đổi -> chúng ta sẽ command luôn phép tính này để không tốn bộ nhớ cho phép tính này: //CLK->CKDIVR |= (uint8_t)CLK_PRESCALER_HSIDIV1;

  5. Demo chạy thử.
    1. Ở đây mình dùng Visual studio viết 1 tool update Firmware từ máy tính thông qua module UART USB. Các file cần chuẩn bị như sau:

      • 1 tool update dùng để chạy trên máy tính.
      • 1 file bootloader.
      • 2 file application chứa 2 version khác nhau và tốc độ thực thi led trên chân PD2 lần lượt là 500ms và 2000ms.
      • 1 module STM8S003F3P6, 1 module UART-USB, 1 mạch nạp stlink_v2.
    2. B1. Nạp file code bootloader thông ST visual programmer bằng mạch nạp stlink.
    3. Lưu ý: các bạn cần config và chọn đúng mạch nạp trước khi nạp bootloader.

    4. B1. Nạp file code bootloader thông ST visual programmer bằng mạch nạp stlink.
    5. B2. Kết nối board với máy tính thông qua module USB_UART.
    6. B3. Mở tool và chọn cổng UART mà máy tính đã nhận.
    7. B4.Chọn đến file hex application với thời gian nháy led là 100ms và version là 1.0 và nhấn nút Upgrade_8s.
    8. Sau khi update xong các bạn đọc version là 1.0 và quan sát led ở chân PD2 sẽ đổi trạng thái với thời gian là 100ms.

    9. B5. Chọn 1 file application khác với thời gian nháy led là 2000ms và version là 1.2. Kết quả sau khi update là:
    10. Note: Vì tính bảo mật và là thành quả của việc nghiên cứu nên mình sẽ không update source code như các hướng dẫn trước mong các bạn thông cảm. Bạn nào trong quá trình làm gặp khó khăn gì cứ comment hay inbox mình, mình sẵn lòng hỗ trợ trong thời gian ngắn nhất có thể. Bài viết có thể có một số thông tin chưa đúng, mong nhận đươc sự góp ý của các bạn. Chúc các bạn thành công!!!

Tạo project cho STM8S với IAR for STM8S

Bài 00: Tạo project cho STM8S với IAR for STM8S.

Tạo project cho STM8S với IAR for STM8S.

Chào các bạn, hôm nay mình sẽ hướng dẫn tạo project mới cho STM8S với trình biên dịch IAR for STM8, trình biên dịch này cũng khá hữu dụng hiện nay. Theo đánh giá cá nhân của mình thì IAR hỗ trợ các tính năng debug, tối ưu code và giao diện thân thiện so với STVD.

  1. Các tool và thư viện cần chuẩn bị.
    • IAR cho STM8: phần mềm này có nhiều source và hướng dẫn khác nhau, ở đây mình sử dụng phiên bản 2.10.1.
    • Thư viện cho STM8S : Bộ thư viện chứa các ví dụ, project mẫu và file thư viện, khá là đầy đủ. Các bạn có thể lấy từ trang chủ của ST, nhớ đăng kí một tài khoản để đăng nhập và tải xuống nha các bạn : https://www.st.com/en/embedded-software/stsw-stm8069.html.
    • Ở đây mình sử dụng STM8S003F3P6, thời điểm viết bài hướng dẫn này thì giá thành của nó cũng khá cao nhưng mình nghĩ nó sẽ vẫn còn thông dụng trong thời gian dài nữa.
  2. Các bước tạo project.
    1. Tạo thư mục chứa tên project(ở đây là GPIO) chứa 2 thư mục con, 1 thư mục tên là lib(chứa các file thư viện), 1 thư mục tên là user(chứa các file sử dụng, lưu workspace, cài đặt, file build…).
    2. Giải nén file library và copy file thư viện, các file user trong library vào thư mục GPIO.
      • Copy “inc” and “src” trong en.stsw-stm8069\STM8S_StdPeriph_Lib\Libraries\STM8S_StdPeriph_Driver đến thư mục GPIO\lib.
      • Copy file “main.c”, “stm8s_conf.h”, “stm8s_it.c” và “stm8s_it.h” từ en.stsw-stm8069\STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Template đến thư mục GPIO\user.
    3. Tạo project mới .
    4. Open IAR cho STM8, vào tab “project” -> “Create new project”.

      1 cửa sổ mới xuất hiện, chọn như hình bên dưới.

      Điền tên file config cho project(file này có đuôi ewp) và chọn nơi lưu là trong thư mục GPIO\user.

    5. Tạo 2 thư mục con vơi tên là “lib” và “user” để add file thư viện và user bằng cách click chuột phải trên giao diện workspace.
    6. Kết quả :

    7. Thêm các file tương ứng vào 2 thư mục đã tạo trên.
    8. Các file được thê vào 2 thư mục trên đã được copy từ sẵn từ trước, tuy từng dự án mà số file thư viện và user sẽ thay đổi, tuy nhiên các file cố định luôn sẽ là “stm8s_gpio.c”, “stm8s_clk.c”, “main.c”, “stm8s_conf.h”, “stm8s_it.c”, “stm8s_it.h”.

      Kết quả sau khi add :

    9. Cấu hình project để link tới các file đã add và file output.
    10. Chọn loại MCU sử dụng, ở đây là STM8S003F3

      Cài đặt đường dẫn và khai báo define MCU :

      Cấu hình loại và tên file output

      Cấu hình chọn debugger nếu sử dụng chế độ debug.

    11. Build code và quan sát kết quả.
    12. Khi chương trình hỏi lưu workspace thì bạn lưu nó ở đường dẫn GPIO/user. Đây chính là file workspace mà mỗi lần mở chương trình bạn sẽ click vào nó.

      Kết quả sau khi build hiện giống dưới hình là đã thành công.

      Kết quả build ra sẽ nằm trong đường dẫn : \GPIO\user\Debug\Exe. Chúc các bạn thành công!!!!!

Link tải source code mẫu cho ví dụ trên. Link tải file cài IAR Link tải file thư viện chuẩn

Bài 09: RTC với STM32F303CC

Bài 08: RTC với STM32F303CC trong MXCUBE

Bài 09: RTC với STM32F303CC.

  1. Giới thiệu sơ lược về ADC.
  2. RTC(Real time clock ) là bộ thời gian thực được tích hợp sẵn trong STM32F303CC. Thay vì phải gắn thêm IC thời gian thực để đọc được ngày tháng năm, giờ phút giây thì không phải dùng nó khi dùng STM32F303CC. Một số ứng dụng chính như làm đồng hồ, mạch kiểm soát thời gian, báo thức, bộ đếm thời gian…

    Bộ RTC này sử dụng timer độc lập, tách biệt với các timer khác. Việc cài đặt thời gian, đọc thời gian cũng trở nên dễ dàng hơn bằng cách tác động trực tiếp vào các thanh ghi thời gian của MCU.

Export library from existing project in altium

Export library from existing project in altium

Export library from existing project in altium

  1. Giới thiệu.
  2. Lấy thư viện từ schematic hay layout có sẵn. Giải thích cho anh em nào chưa hiểu:

    • Schematic : là sơ đồ nguyên lí tức là sơ đồ kết nối các đường dây với nhau dưới dạng biểu đồ, giản đồ…. Hay được hiểu là cách kết nối để mạch điện được chạy đúng.
    • Layout : là file bố trí, sắp đặt linh kiện, đi các đường dây, chú thích, số lớp di dây … và cũng là nơi được xuất ra file GERBER để các nhà sản xuất mạch có thể gia công chúng.

Bài 08: DAC với STM32F303CC

Bài 08: DAC với STM32F303CC trong MXCUBE

Bài 08: DAC với STM32F303CC.

  1. Giới thiệu sơ lược về ADC.
  2. DAC – Digital to Analog Converter là bộ chuyển đổi số ra tín hiệu tượng tự. Tạm hiểu nôm na là : chân GPIO của STM32 chỉ xuất được 2 giá trị là 0 hoặc 3V3, nếu ta cần 1 giá trị điện áp nằm giữa 0 – 3V3 và có thể thay đổi được thì dùng DAC là cách hữu hiệu nhất.

    Ứng dụng : DAC chủ yếu được ứng dụng trong các thiết bị âm thanh, audio. Ngoài ra nó còn được sử dụng để điều khiển tốc độ của một số driver, tạo các sóng sin, sóng bậc thang….

Bài 07: ADC với STM32F303CC.

Bài 07: ADC với STM32F303CC.

Bài 07: ADC với STM32F303CC.

  1. Giới thiệu sơ lược về ADC.
  2. ADC – Analog to digital Converter là bộ chuyển đổi tín hiệu tương tự sang tín hiệu số. ADC được ứng dụng rất nhiều như đo nhiệt độ, đọc giá trị điện áp, cường độ dòng điện, đọc phím nhấn, đọc giá trị biến trở, bảo vệ động cơ…. Khi tìm hiểu về ADC chúng ta cần tìm hiểu bộ ADC đó là bao nhiêu bit, các phương pháp chuyển đổi. ADC có số bit càng cao tức là độ phân giải của bộ ADC càng lớn, bộ ADC đó càng xịn.

    ADC trong STM32F303CC là bộ ADC có 12 bit - tức là giá trị đọc về nằm trong khoảng 0 ->2^12-1= 4095. Giá trị điện áp đầu vào bộ ADC được cung cấp trên chân VDDA và thường lấy bằng giá trị cấp nguồn cho vi điều khiển VDD(+3V3) nên với các ứng dụng quan trọng sử dụng ADC phần cứng cần được thiết kế khối nguồn với chân VDDA cẩn thận. STM32F103C8 có 4 kênh ADC đó là ADC1, ADC2, ADC3 và ADC4; số lượng channel của mỗi kênh là khác nhau với nhiều mode hoạt động như: single, continuous, scan hoặc discontinuous. Kết quả chuyển đổi được lưu trữ trong thanh ghi 16 bit với 2 dạng data là MSB là bit cao nhất hoặc LSB là bit cao nhất. Đọc biến trở là ví dụ đơn giản nhất của chức năng ADC:

    Số lượng các chanel ADC của các kênh cho dòng STM32F3:

    Một số tính năng chính được liệt kê như sau:

    • Độ phân giải 12 -10 - 8 - 6 bit tương ứng với giá trị maximum là 4096 – 1024 – 256 - 32.
    • Được chia là các loại phụ thuộc vào tốc độ chuyển đổi như fast channel(5.1 Ms/s) hoặc slow channel(4.8 Ms/s).
    • Thời gian chuyển đổi phụ thuộc vào clock của hệ thống cũng như clock chia cho bộ ADC được sử dụng.
    • Có các ngắt hỗ trợ như End conversion, End of Injected Conversion and Analog Watchdog Event.
    • Single mode hay Continuous mode.
    • Tự động calib và có thể điều khiển hoạt động ADC bằng xung Trigger.
    • Điện áp cung cấp cho bộ ADC là 2.4V -> 3.6V. Nên điện áp Input của thiết bị có ADC 2.4V ≤ VIN ≤ 3.6V.
    • Có bộ DMA giúp tăng tốc độ xử lí.
    • Các tính năng bổ trợ như: hoạt động ở chế độ low-power, kênh cảm biến nhiệt nội bên trong chip, kênh đo điện áp tham chiểu Vref, kênh đo điện áp trên chân Vbat….
  3. Cấu hình trên STM32 CubeMx.
  4. VD: Viết chương trình đọc điện áp trên chân PA0, với độ phân giải là 12 bit, Continuous conversion. Dùng UART2 để hiển thị giá trị ADC lên mà hình máy tính.

    1. New project. Cửa sổ mới được mở ra. Chọn loại MCU theo tên hoặc theo họ, loại package… Ở đây mình nhớ tên luôn nên gõ vào cho nhanh STM32F303CC.

Bài 06: UART với STM32F303CC trong MXCUBE


Bài 06: UART với STM32F303CC trong MXCUBE

UART với STM32F303CC

  1. Giới thiệu sơ lược về UART.
  2. UART - Universal synchronous asynchronous receiver transmitter là một ngoại vi cơ bản và thường dùng trong các quá trình giao tiếp với các module như : Xbee, Wifi, Blutooth…. Khi giao tiếp UART kết hợp với các IC giao tiếp như MAX232CP, SP485EEN…. thì sẽ tạo thành các chuẩn giao tiếp RS232, RS485. Đây là các chuẩn giao tiếp thông dụng và phổ biến trong công nghiệp từ trước đến nay.

    Khi ta sử dụng chân UART_CLK thì giao tiếp UART sẽ trở thành giao tiếp đồng bộ và không dùng sẽ là chuẩn giao tiếp không đồng bộ. Các bạn để ý là với bất cứ 1 chuẩn truyền thông nào, khi có sử dụng 1 chân tín hiệu làm chân CLK thì chuẩn giao tiếp đó sẽ là chuẩn giao tiếp đồng bộ và ngược lại. Ở đây mình chỉ đề cập đến giao tiếp UART không đồng bộ.

    Ưu điểm của giao tiếp UART không đồng bộ: tiết kiệm chân vi điều khiển(2 chân), là ngoại vi mà bất kì 1 VĐK nào cũng có, có khá nhiều module, cảm biến dùng UART để truyền nhận data với VĐK. Nhược điểm của loại ngoại vi này là tốc độ khá chậm, tốc độ tối đa tùy thuộc vào từng dòng, quá trình truyền nhận dễ xảy ra lỗi nên trong quá trình truyền nhận cần có các phương pháp để kiểm tra(thông thường là truyền thêm bit hoặc byte kiểm tra lỗi). UART không phải là 1 chuẩn truyền thông, khi muốn nó là 1 chuẩn truyền thông hoặc truyền data đi xa, chúng ta cần phải sử dụng các IC thông dụng để tạo thành các chuẩn giao tiếp đáng tin cậy như RS485 hay RS232....

    Thông thường chúng ta sẽ dùng ngắt nhận UART để nhận dữ liệu vì sử dụng ngắt sẽ tiện lợi, không tốn thời gian chờ cũng như mất dữ liệu.Các tốc độ thường dùng để giao tiếp với máy tính: 600,1200,2400,4800,9600,14400,19200,38400,56000,57600,115200.

    Một số phần mềm giao tiếp với máy tính: hercules_3-2-5,teraterm, Serial-Oscilloscope-v1.5...Một số modulde dùng để giao tiếp với máy tính: CP2102 USB 2.0, USB ra UART dùng PL2303, USB to UART dùng TTL FT232RL, USB ra UART dùng CH340G…

    STM32F303CC có 3 bộ UART với nhiều mode hoạt động, với nhiều bộ UART ta có thể sử dụng được nhiều ứng dụng hơn so với 1 chip điều khiển so với STM8S. Một số tính năng nổi bật như sau:

    • Đầy đủ các tính năng của bộ giao tiếp không đồng bộ.
    • Điều chỉnh baud rate bằng lập trình và tốc độ tối đa lên đến 9Mb/s.
    • Cấu hình với nhiều mode hoạt động.
    • Có lựa chọn khi cấu hình với RS232 hoặc RS485.
    • Độ dài được lập trình là 7, 8 hoặc 9 bit.
    • Cấu hình bit stop hỗ trợ là 1 hoặc 2.
    • Có chân clock nếu muốn chuyển giao tiếp thành đồng bộ.
    • Cấu hình sử dụng 1 dây hoặc 2 dây.
    • Có bộ DMA nếu muốn giảm thời gian truyền nhận.
    • Bit cho phép truyền nhận riêng biệt.
    • Có cờ báo giao tiếp và cớ báo lỗi.
    • Cờ báo ngắt có thể lên đến 14 loại khác nhau.
  3. Cấu hình trên STM32 cubeMx.
  4. Vd: Viết chương trình VĐK nhận được kí tự nào từ máy tính thì gửi lại kí tự đó lên lại máy tính. Sử dụng phần mềm hescules để gửi và quan sát kí tự nhận được. Sử dụng UART2, tốc độ baud là 9600, sử dụng ngắt nhận UART. Led ở chân PB9 sẽ đảo trạng thái mỗi khi nhận được 1 kí tự mới.

    1. New project . Cửa sổ mới được mở ra. Chọn loại MCU theo tên hoặc theo họ, loại package… Ở đây mình nhớ tên luôn nên gõ vào cho nhanh STM32F303CC.