Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (667.85 KB, 23 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
1
</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2"><b>Bài tập 1: Viết chương trình chớp tắt led đơn ở chân GPIOA10</b>
/* USER CODE BEGIN 2 */
RCC->AHB1ENR |= (1<<0); //Clock for GPIOB GPIOA->MODER |= (1<<(10*2)); // GPIO output A0 GPIOA->OTYPER &= ~(0<<10); //push - pull GPIOA->OSPEEDR |= (0<<20); //medium speed /* USER CODE END 2 */
/* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ }
/* USER CODE END 3 */ }
</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3"><b>Bài 2: Viết chương trình đọc nút nhấn P1 và chớp tắt led đơn</b>
/* USER CODE BEGIN 2 */
RCC->AHB1ENR |= (1<<0); //Clock for GPIOB RCC->AHB1ENR |= (1<<3); //Clock for GPIOD GPIOA->MODER |= (1<<(10*2)); // GPIO output A0 GPIOA->OTYPER &= ~(0<<10); //push - pull GPIOA->OSPEEDR |= (0<<20); //medium speed
</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">/* USER CODE BEGIN 3 */ }
/* USER CODE END 3 */ }
<b>Bài 3: Viết chương trình đọc nút nhấn và thực hiện theo yêu cầu sau - Nhấn (không giữ) nút nhấn lần 3n, 3 led dịch với chu kỳ 0.1s</b>
<b>-Nhấn (không giữ) nút nhấn lần 3n+1, 3 led dịch với chu kỳ 1s.-Nhấn (không giữ) nút nhấn 3n+2, tắt cả 3 led.</b>
/* USER CODE BEGIN 2 */
RCC->AHB1ENR |= (1<<1); //Clock for GPIOB RCC->AHB1ENR |= (1<<4); //Clock for GPIOE RCC->AHB1ENR |= (1<<3); //Clock for GPIOD
GPIOB->MODER |= (1<<0)|(1<<2)|(1<<4); // GPIO output B0 //GPIOB->OTYPER;
GPIOB->OTYPER &= ~(1<<0); //push - pull GPIOB->OSPEEDR |= (1<<0); //medium speed
</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">/* USER CODE END WHILE */ /* USER CODE BEGIN 3 */
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">/* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ }
/* USER CODE END 3 */ }
/* USER CODE BEGIN 2 */ RCC->AHB1ENR|= (1<<1); RCC->AHB1ENR|= (1<<4); RCC->AHB1ENR|= (1<<3); GPIOD->MODER = 0<<(11*2);
</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">/* USER CODE BEGIN 3 */
</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">/* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ }
/* USER CODE END 3 */ }
<b>Bài tâp 7: Viết chương trình nhấn nút thực hiện yêu cầu sau- Nhấn nút P1 (không giữ) băng tải quay</b>
<b>- Nhấn nút P2 (không giữ) băng tải dừng</b>
#define RCC_AHB1ENR (*((unsigned int*)0x40023830)) #define GPIOB_MODER (*((unsigned int*)0x40020400)) #define GPIOB_IDR (*((unsigned int*)0x40020410)) #define GPIOB_ODR (*((unsigned int*)0x40020414))
int main(void)
</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">// Enable GPIOB clock
RCC_AHB1ENR |= 0x02; // bit 1: GPIOB clock enable
// Configure GPIOB0 and GPIOB1 as input pins
GPIOB_MODER &= ~(0x03 << 2*0); // Clear mode for GPIOB0 GPIOB_MODER &= ~(0x03 << 2*1); // Clear mode for GPIOB1
// Start conveyor belt
GPIOB_ODR |= (1 << 5); // Set bit 5 to high }
// Check if button P2 is pressed if ((GPIOB_IDR & (1 << 1)) == 0) {
// Stop conveyor belt
GPIOB_ODR &= ~(1 << 5); // Set bit 5 to low }
}
</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20"><b>Bài tập 8: Viết chương trình xử lý tiens hiệu trả về từ cảm biến S1, S2 theo yêu cầu sau-Nếu S1 bị ngừng tác động, chớp tắt Led đơn với chu kỳ 500ms</b>
<b>-Nếu S2 bị ngừng tác động, chớp tắt Led đơn với chu kỳ 1000ms</b>
/* USER CODE BEGIN 2 */
</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">while (1) {
/* USER CODE END WHILE */ //chop tat led su dung cam bien
<b>Bài tâp 9: Viết chương trình xử lý tín hiệu trả về từ cảm biến S1, S2 theo yêu cầu sau</b>
- Nếu S1 bị ngừng tác động, Băng tải quay
</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">- Nếu S2 bị ngừng tác động, Băng tải dừng
#define RCC_AHB1ENR (*((volatile unsigned long*)0x40023830)) // Ðia chi thanh ghi de bat tín hieu clock cho GPIO
#define GPIOA_MODER (*((volatile unsigned long*)0x40020000)) // Ð?a chi thanh ghi de cau hình chân GPIO
#define GPIOA_IDR (*((volatile unsigned long*)0x40020010)) // Ð?a chi thanh ghi de doc giá tri tu chân GPIO
#define GPIOA_ODR (*((volatile unsigned long*)0x40020014)) // Ð?a chi thanh ghi de ghi giá tri vào chân GPIO
#define S1_Pin (1 << 0) // Chân GPIO dùng de ket noi voi cam bien S1 #define S2_Pin (1 << 1) // Chân GPIO dùng de ket noi voi cam bien S2 #define Motor_Pin (1 << 2) // Chân GPIO dùng de dieu khien bang tai
// clock GPIO
RCC_AHB1ENR |= (1 << 0);
// C?u hình chân GPIOA0 và GPIOA1 là dau vào (input) de ket noi voi cam bien S1 và S2 GPIOA_MODER &= ~(3 << 0); // GPIOA0
GPIOA_MODER &= ~(3 << 2); // GPIOA1
// Cau hình chân GPIOA2 là dau ra (output) de dieu khien bang tai GPIOA_MODER &= ~(3 << 4); // GPIOA2
GPIOA_MODER |= (1 << 4); // Output mode
while(1) {
</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">// Ðoc giá tri tu cam bien S1 và S2
int s1_value = (GPIOA_IDR & S1_Pin) ? 1 : 0; int s2_value = (GPIOA_IDR & S2_Pin) ? 1 : 0;
// Neu cam bien S2 bi ngung tác dong, bang tai dung GPIOA_ODR &= ~Motor_Pin;
} } }
</div>