Điều này cho phépcác chân ở các port được sử dụng trong quá trình debug... Do đó, FET được dùng để phát triển các ứng dụng trên họ MCU này qua 2 cơ chế giaotiếp của FET là qua USB cổng s
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐẠI HỌC ĐÀ NẴNG
KHOA ĐIỆN TỬ - VIỄN THÔNG
Đà Nẵng 2023
Trang 3Mục tiêu:
- Sử dụng KIT MSP-EXP430FG4618 để thực hiện các bài lab cơ bản
- Sử dụng bộ Debug MSP-FET430UIF để nạp chương trình cho chip MSP430trên KIT MSP-EXP430FG4618
- Sử dụng phần mềm IAR để lập trình một chương trình đơn giản
- Thực hiện các bài liên quan đến xuất/nhập, ngắt, timer
1 KIT MSP-EXP430FG4618:
1.1 Giới thiệu chung:
KIT MSP-EXP430FG4618 của hãng TI là bo mạch tích hợp 2 chip
MSP430FG4618 và MSP430F2013 nên cung cấp các ngoại vi phổ biến trong họMSP430 Đặc biệt, 2 chip 4618 và 2013 có thể giao tiếp với nhau (xem hình 2) hoặcgiao tiếp với các thiết bị bên ngoài
Có thể sử dụng một trong 2 gói công cụ sau để lập trình và debug: IAR EmbeededWorkbench, TI Code Composer Essential (CCE) và TI code Composer Studio (CCS).Thiết bị để lập trình và debug cho chip TI là TI USB Flash Emulation Tool (FET)
Hình 1. KIT MSP-EXP430FG4618 do TI tài trợ cho bộ môn Kỹ thuật Máy tính
1.2 Sơ đồ khối phân bổ linh kiện trên KIT MSP-EXP430FG4618:
Trang 4Hình 2. Sơ đồ khối phân bổ linh kiện trên KIT MSP-EXP430FG4618
1.2.1 JTAG:
Hai header JTAG1 và JTAG2 để lập trình và debug mỗi MSP430 riêng biệt:JTAG1 cho MSP430FG4618 và JTAG2 cho MSP430F2013 JTAG1 choMSP430FG4618 dùng kiểu kết nối JTAG chuẩn 4 dây, còn JTAG choMSP430F2013 dùng kiểu giao tiếp JTAG Spy-Bi-Wire (2 dây) Điều này cho phépcác chân ở các port được sử dụng trong quá trình debug
Trang 5Hình 5. Sơ đồ nguyên lý kết nối LED1, LED2 & LED4 với MSP430FG4618
Hình 6 Sơ đồ nguyên lý kết nối LED3 với MSP430FG4618
Trang 6Hình 8 Sơ đồ bố trí jumper ở trên KIT MSP430FG4618
Bảng 2 Liệt kê chức năng của jumper trên KIT MSP430FG4618 khi được kếtnối
Header Chức năng khi dung Jumper
Yêu cầu cần gắn jumper này để sửdụng FG4618PWR2 Cung cấp nguồn cho
pin AAA Ngoài ra, dung để
đo dòng tổng cộng của kit
Pin không cung cấpnguồn cho cả 2chip MSP430
Yêu cầu khi cầndùng pinJP1 Để sử dụng buzzer (nối với Không dùng buzzer Tùy chọn
Trang 7chân FG4618-P3.5)
JP2 Cho phép LED3 hoạt
động (LED3 nối với
chân F2013-P1.0)
Không dùng LED3 Tùy chọn/ yêu cầu
khi dùng LED3
JP3 Cho phép LED4 hoạt
động (LED4 nối với
Không giao tiếp qua I2C Yêu cầu cho giao
tiếp bên trong processorH1(1-2,
Không giao tiếp qua SPI Yêu cầu cho giao
tiếp bên trong processor
Vcc VCC_1: 3 chân phía dưới
Dùng cho FG4618/JTAG1
VCC_2: 3 chân phía trên
Dùng cho F2013/JTAG2
LCL: cung cấp Vcc đến FET
FET: nguồn từ FET
(jumper BATT không
được thiết lập)
Nguồn từ JTAG Yêu cầu khi sử
dụng không cần pin
Trang 81.3 Sơ đồ nguyên lý của KIT MSP-EXP430FG4618:
Trang 9
Hình 9 Sơ đồ nguyên lý toàn KIT MSP430FG4618
2 ĐẶC TÍNH VÀ CÁCH CÀI ĐẶT BỘ DEBUG MSP-FET430UIF:
2.1 Giới thiệu công cụ FET:
FET (Flash Emulation Tool) cho phép lập trình - debug họ vi xử lý MSP430 quachuẩn kết nối JTAG đầy đủ(4 dây) và JTAG tiết kiệm chân (2 dây, Spy Bi-Wire) Do
đó, FET được dùng để phát triển các ứng dụng trên họ MCU này qua 2 cơ chế giaotiếp của FET là qua USB cổng song song, tương ứng với các loại MSP-FET430UIF (Hình 10) và MSP- FET430PIF Hiện tại, Công ty TI chỉ tài trợ loạiMSP – FET430UIF cho bộ môn Kỹ thuật Máy tính nên tất cả các bài thí nghiệm trênKIT MSP430FG4618 sẽ sử dụng loại này
Hình 10 Bộ Debug MSP-430UIF Bảng 3 So sánh một vài tính năng giữa 2 loại MSP-FET430UIF và MSP-
FET430PIF
MSP-FET430UIF
FET430PIF
MSP-Hỗ trợ tất cả họ MSP430 dựa trên Flash (F1xx,
Debug dùng JTAG chuẩn 2 dây (Spy-Bi-Wire) x KHÔNG
Trang 10Hỗ trợ bởi CCE x x
3 THIẾT LẬP CƠ BẢN CHO THÍ NGHIỆM:
Sau đây là các bước cơ bản nhất mà người làm thí nghiệm phải nắm kỹ trước khi bắt tay vào sử dụng mọi công cụ để thực hiện các bài thí nghiệm Trong từng bài thínghiệm, sẽ trình bày các bước thiết lập thêm tùy thuộc từng bài
Bước 1: Thiết lập MSP-EXP430FG4618
- Kiểm tra/sử dụng jumper PWR1 để cung cấp nguồn cho FG4618 (jumper PWR1 nằm khoảng giữa kit, phía bên phải chip M430G4618, nếu đặt kit như vị tríhình 1)
- Kiểm tra/ không sử dụng jumper BATT (jumper BATT ở phía dưới, bên phảikit) Khi thí nghiệm, thiết lập như vậy để không sử dụng pin cung cấp nguồn cho 2chip với mục đích tiết kiệm pin
- Kiểm tra/ sử dụng jumper Vcc (jumper Vcc ở phía dưới, bên phải kit) Để thiếtlập sử dụng nguồn từ FET (khi không dùng pin), thiết lập jumper ở vị trí FET cho cả
2 hàng 1 và 2 (nghĩa là 2 jumper kết nối, mỗi jumper kết nối 2 header tận cùng bên phải: 2 header phía dưới: dùng cho FG4618/JTAG1, 2 chân phía trên: dùng choF2013/JTAG2)
Bước 2: Kết nối FET430UIF
- Kết nối dây USB giữa máy tính và FET
- Kết nối dây 14 pin JTAG giữa FET và kit MSP-EXP430FG4618
Trang 11Thay đổi các Jump trên mạch:
Trên mạch nạp,led xanh (Power) báo hiệu nguồn,led đỏ (Mode) báo hiệu khimạch được nạp
Bước 3: Sử dụng IAR để lập trình-debug
Bước 4: Thực hiện các bài thí nghiệm
4 CẤU TRÚC MỘT CHƯƠNG TRÌNH C THÔNG THƯỜNG CHOMSP430:
Trang 12o Trong C cho MSP430, thì có các hằng số được định nghĩa trước (ở fileheader), ta rất hay dùng các hằng số này: BIT0 = 0000 0001
P1DIR = 0xFF; // toàn bộ port1 là Output
P1DIR = 0x00; //toàn bộ port1 là Input
Như vậy nếu muốn một số chân của port1 là Output và một số chân của port1 làInput thì làm thế nào? Không giống một số VĐK khác, MSP430 không cho phép tatác động trực tiếp đến 1 chân nào riêng lẻ, chỉ có thể tác động lên port (8 chân) Nhưvậy muốn tác động lên chân riêng lẻ nào thì ta dùng phép toán OR, AND và XOR
P2DIR |= BIT0 + BIT1 + BIT3; //chân P2.0, P2.1, P2.3 sẽ là Output
Lệnh trên cũng có thể viết lại: P2DIR |= 0x0B; // BIT0 + BIT1 + BIT3 = 11d=0Bh
P2DIR &= ~(BIT4+BIT5); //P2DIR &=~0x30;//chân P2.4, P2.5 là Input
o Xuất ra port theo từng bit riêng lẻ
Như việc định nghĩa các chân, MSP430 cũng không cho ta tác động trực tiếp đếntừng chân nào, muốn xuất ra một bit hay nhiều bit bất kỳ ta sử dụng cách như đã dùngvới định nghĩa chân
Ví dụ muốn cho P1.1=1, P1.3=1, P2.1=0
P1OUT |= BIT1+BIT3 ;//P1.1=1, P1.3=1
P2OUT &=~ BIT1 ; //P2.1=0
Hoặc có thể đảo một bit ở chân bất kỳ bằng lện XOR ^
P1OUT ^= BIT4 ;//chân P1.4 đảo trạng tháio Kiểm tra trạng thái một chân. Ngoài ngắt ra ta có thể kiểm tra trạng thái một chân nào đó đang ở mức thấp (0V)hay mức cao (1.8V đến 3.6V)
Ví dụ kiểm tra chân P1.2
if((P1IN&BIT2)==0 ) //nếu chân P1 bằng 0
//do anything else
//do anything
// nếu viết if( P1IN&BIT2==0 ), thiếu 1 ngoặc là sai
Trang 135 CÁC BÀI THÍ NGHIỆM:
Bài 1: GPIO
1 Các thanh ghi liên quan đến GPIO:
1.1 Direction Register PxDIR (P1DIR, P2DIR):
Đây là các thanh ghi 8 bit điều khiển chiều của 8 chân port P1DIR điều khiểnPORT1, P2DIR điều khiển PORT2
Bit = 1: Chân PORT tương ứng được cấu hình thành output
Bit = 0: Chân PORT tương ứng được cấu hình thành input
1.2 Input Register (PxIN):
Đây là các thanh ghi 8 bit chứa giá trị đọc được từ các chân PORT
Bit = 1: Chân PORT tương ứng ở mức cao
Bit = 0: Chân PORT tương ứng ở mức thấp
1.3 Output Register (PxOUT):
Đây là các thanh ghi điều khiển ngõ ra của các PORT
Bit = 1: Xuất mức cao ra chân PORT tương ứng
Bit = 0: Xuất mức thấp ra chân PORT tương ứng
1.4 Function Select Register:
Đây là các thanh ghi chọn chức năng cho chân PORT Mỗi chân PORT có thểcấu hình chọn chức năng Input/Output hay là chức năng đặc biệt khác
Bit = 1: Chọn chức năng đặc biệt
Bit = 0: Chọn chức năng GPIO
2 Các lưu ý khi viết chương trình cho lab này:
2.1 Watchdog Timer:
Trong lab này, chúng ta không cần sử dụng Watchdog timer Để tắt Watchdogtimer, ghi giá trị 5A vào 8 bit cao của thanh ghi WDTCTL và set thứ 7 của thanhghi WDTCTL WDTCTL = 0x5A00 | 0x0080 hoặc:
(WDTCTL = WDTPW | WDTHOLH )2.2 Delay:
Bởi vì trong chương trình chưa định nghĩa clock nên CPU sẽ sử dụng thạch anh32.768 kHz Để có thời gian delay khoảng 1s, vòng delay sẽ đếm xuống từ30.000SV có thể dùng câu lệnh dưới đây để tạo delay: for(int i=30000;i>0;i++);Bài 1.1
Yêu cầu: Sinh viên viết chương trình cho LED1 và LED2 sáng tắt luân phiên.Thời gian giữa 2 lần sáng tắt là khoảng 1s
Trang 14Câu hỏi 1: Các LED được kết nối với MCU như hình trên Điền vào chỗ trống
để trả lời các câu hỏi dưới đây
+ LED1 nối vào chân nào của MCU? (Cổng (Port) nào?)
Trả lời: LED1 nối vào chân P2.2 của MCU
+ LED2 nối vào chân nào của MCU? (Cổng (Port) nào?)
Trả lời: LED2 nối vào chân P2.1 của MCU
+ Để điều khiển LED, các chân port phải là input hay output?
Trả lời: Để điều khiển LED, các chân port phải là output
+ Để LED sáng, phải xuất giá trị gì ra chân port?
Trả lời: Để LED sáng, phải xuất giá trị Bit = 1
Câu hỏi 2: Hoàn chỉnh chương trình bằng cách điền vào các chỗ trống:
#include <msp430xG46x.h>
void main (void)
{
volatile unsigned int i;
WDTCTL = WDTPW |WDTHOLD; //Stop Watchdog TimerP2DIR |=BIT0 +BIT 6 ; //Configure P2.1 and P2.2
as OutputP2OUT &= BIT0 +BIT 6 ; // Turn off LED1, LED2P2OUT |= BIT3;
}
}
Trang 15+ SW1 nối vào chân nào của MCU? (Cổng (Port) nào?)
Trả lời: SW1 nối vào chân P1.8 của MCU
+ SW2 nối vào chân nào của MCU? (Cổng (Port) nào?)
Trả lời: SW2 nối vào chân P1.1 của MCU
+ Để đọc trạng thái switch, các chân port phải là input hay output?
Trả lời: Để đọc trạng thái switch, các chân port phải là input
Câu hỏi 2: Hoàn chỉnh chương trình bằng cách điền vào các chỗ trống:
#include <msp430xG46x.h>
void main (void)
{
volatile unsigned int i;
WDTCTL = WDTPW |WDTHOLD; //Stop Watchdog Timer
(LED1)P1DIR &= ~ BIT0 ;
for(i=30000;i<0;i ); //Delay, button debouncewhile ((P1IN & 0x01)!=BIT0); //Wait for the release of the
buttonfor(i=30000;i<0;i ); //Delay, button debounce
Trang 16Bài 2: GPIO & INTERRUPT
MSP430 được thiết k để làm việc với các ứng dụng công suất thấp Vì vậyCPU thường ở trạng thái “off” trong phần lớn thời gian Để đưa CPU vào trạngthái “off”, các bit SCG1, SCG0 và CPUOFF trong thanh ghi SR được set
Một ngắt xảy ra sẽ đánh thức CPU Khi đó thanh ghi SR được lưu vào stack vàCPU thực thi ISR
Khi thoát khỏi ISR, thanh ghi SR được lấy ra từ stack và làm cho CPU tắt trởlại
Đưa CPU vào trạng thái công suất thấp và cho phép ngắt:
Bit GIE trong thanh ghi SR khi được set sẽ cho phép ngắt
Ta đưa CPU vào trạng thái công suất thấp, cho phép ngắt bằng lệnh:
_BIS_SR (LPM3_bits + GIE);
Trong đó:
LPM3_bits = (SCG1+SCG0+CPUOFF)
Định nghĩa chương trình phục vụ ngắt (ISR):
Ta định nghĩa 1 ISR tại vector ngắt ISR_VECTOR bằng cấu trúc sau:
#pragma vector=ISR_VECTOR interrupt
void myISR (void) {
………
}
1.5 Các thanh ghi cấu hình ngắt cho các chân PORT:
Mỗi chân PORT của MSP430 đều có thể dùng để tạo ngắt Các ngắt này đượccấu hình thông qua các thanh ghi PxIFG, PxIE, PxIES
1.5.1 Interrupt enable Register (PxIE):
Mỗi bit trong thanh ghi này dùng để cho phép/không cho phép ngắt trên chânPORT tương ứng
Bit = 1: Cho phép ngắt
Bit = 0: Cấm ngắt
1.5.2 Interrupt Edge Select Register (PxIES):
Dùng để chọn cạnh của tín hiệu ngắt:
Bit = 1: Ngắt tại cạnh xuống của tín hiệu
Bit = 0: Ngắt tại cạnh trên của tín hiệu
1.5.3 Interrupt Flag Register (PxIFG):
Thanh ghi này chứa các cờ ngắt Các cờ này được tự đọng bật bởi phần cứng, phải được xóa bằng phần mềm Các cờ này có thể được bật bằng phần mềm đểcho phép ngắt
Bit = 1: Một ngắt đang chờ xử lý
Bit = 0: Không có ngắt nào đang chờ
Trang 17+ SW1 nối vào chân Port gì của CPU?
Trả lời: SW1 nối vào chân Port 1.0 của CPU
+ Khi Switch được nhấn, sẽ có chuyển trạng thái như thế nào trên chân PORT?
+ Để cho phép ngắt trên chân P1.0, ta phải ghi 1 vào bit 0 của thanh ghiPxIE?
X
Trang 18+ Để chọn cạnh xuống cho ngắt trên chân P1.0, ta phải ghi 1 vào bit 0 củathanh ghi PxIES?
Câu hỏi 2: Hoàn chỉnh chương trình bằng cách điền vào các chỗ trống:
#include <msp430xG46x.h>
#pragma vector= PORT1 _VECTOR
interrupt void Port_1 (void)
0xFFE8 volatile unsigned int i;
P2OUT ^= BIT2; //Toggle Port P2.2
for(i=30000;i<0;i ); //Delay, button debounce
while ((P1IN&BIT0)!=BIT0); //Wait for the release of the button
for(i=30000;i<0;i ); //Delay, button debounce
P1IFG &= ~0x01; //Clean P1.0 Interrupt Flag (bit 0 ofP1IFG register)
}
void main (void)
{
WDTCTL = WDTPW |WDTHOLD ;//Stop Watchdog Timer
P2DIR |=BIT2; //Configure P2.2 as Output (LED1)P1DIR &= ~BIT0; //Configure P1.0 as Input (S1)
P1IE |=BIT0; //Interrupt Enable in P1.0
P1IES |=BIT0; //P1.0 Interrupt flag high-to-low
Trang 19điều khiển LED1 Sinh viên có thể sử dụng một số gợi ý sau đây để viết chươngtrình.
Để phát hiện nút nhấn có được nhấn hay không, sử dụng cấu trúc lệnh:
if ( !P1IN & 0x01)Sau đó khai báo một biến điều khiển chương trình phát hiện LED nhấp nháy haykhông, khi nút được nhấn:
-Định nghĩa biến chỉ thị khi LED đang nháy:
Unsigned char blink_status = 1;
-Thiết lập chương trình hoạt động phụ thuộc vào trạng thái của biến
// Delay, button debounce
while (!(P1IN &
if (blink_status ==1){ // If led is blinking, stop it
P2OUT&= ~ 0x04; // Turn Led off
Trang 20P1OUT &= ~BIT0;
blink_status = 0;
}else blink_status = 1;
}}
}
Bài 2.3
Yêu cầu: Sinh viên viết chương trình cho phép/không cho phép LED1 nhấpnháy khi Switch 1 được nhấn Trong chương trình sử dụng ngắt trên chân port giaotiếp switch
Hướng dẫn: Sinh viên vận dụng kiến thức và các hướng dẫn đã có trong bài 2.1
WDTCTL = WDTPW + WDTHOLD; // Disable Watchdog Timer
P1DIR |= BIT0; // Set P1.0 as output (to control LED1)
P1OUT &= ~BIT0; // Turn off LED1 initially
P1DIR &= ~BIT3; // Set P1.3 as input (to read the status of SW1)
Trang 21P1REN |= BIT3; // Enable internal resistor for P1.3
P1OUT |= BIT3; // Set P1.3 as pull-up resistor
P1IE |= BIT3; // Enable interrupt for P1.3
P1IES |= BIT3; // Set interrupt on falling edge
P1IFG &= ~BIT3; // Clear interrupt flag
Hướng dẫn: Sinh viên vận dụng kiến thức và các hướng dẫn đã có trong bài 2.1
và 2.2 để viết chương trình
Viết chương trình vào đây:
#include <msp430.h>
#define SW1 BIT3
#define LED1 BIT0
#define LED2 BIT6
volatile char blink_status = 1;
Trang 22void main ( void )
{
Hướng dẫn: Sinh viên vận dụng kiến thức và các hướng dẫn đã có trong bài 2.1
và 2.2 để viết chương trình
Viết chương trình vào đây:
#include <msp430.h>
volatile char blink_status = 1;
void main ( void )
Trang 23P1REN |= BIT3; // Enable internal resistor for P1.3
void delayMS(int msecs);
unsigned int OFCount;
Trang 24unsigned char ledState = 0;
#pragma vector = TIMER0_A0_VECTOR
interrupt void Timer_A_CCR0_ISR(void)