intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Bài 4: LCD I2C với STM32F407 discovery

Chia sẻ: _ _ | Ngày: | Loại File: PDF | Số trang:28

143
lượt xem
7
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

"Bài giảng Bài 4: LCD I2C với STM32F407 discovery" trình bày chương trình STM32F407, khởi tạo và khai báo dùng STM32CubeMX, chương trình mẫu toàn code, lệnh cho phép bắt đầu chuyển đổi ADC, lập trình hệ thống nhúng STM32F407.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Bài 4: LCD I2C với STM32F407 discovery

  1. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU Bài 4. LCD I2C VỚI STM32F407 DISCOVERY 4.1. Chương trình STM32F407 Viết chương trình đọc dữ liệu ADC chân PA4, PA5, PA6 hiển thị dữ liệu lên LCD kiểu giao tiếp I2C dùng STM32F407 4.1.1. Khởi tạo và khai báo dùng STM32CubeMX Trong mục System core chọn RCC, chế độ High speed clock (HSE) chọn Crystal/Ceramic Resonator. Trong thẻ connectivity, chọn I2C1: Ngô Thanh Đông 86
  2. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU Trong thẻ DMA Add thêm I2C1_TX như hình bên dưới Ngô Thanh Đông 87
  3. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU Tronh thẻ PinOut view Kích chuột vào chân PD12, PD13, PD14, PD15 chọn GPIO_Output Trong thẻ System view chọn GPIO, chọn chân PD12, PD13, PD14, PD15: GPIO output level: LOW GPIO mode: Output Push Pull GPIO Pull-up/Pull-down: No pull-up and no pull-down Maximum output speed: High Tronh thẻ PinOut view Kích chuột vào chân PA4, PA5, PA6 chọn là ADC1_IN4, ADC1_IN5, ADC1_IN6. Ngô Thanh Đông 88
  4. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU Tronh thẻ PinOut view chọn ADC1. Thẻ DMA settings chọn Add, sau đó chọn ADC1 Ngô Thanh Đông 89
  5. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU DMA request settings: mode chọn circular Trong ADC1 , thẻ parameter Setting: ADCs_common_settings: Mode: chọn Independent mode Ngô Thanh Đông 90
  6. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU ADC_settings: Clock prescaler: PCLK2 divided by 2 Resolution : 12 bits (15ADC clock cycles) _ độ phân giải của ADC là 12 bit. Data Alignment: Right Alignment Scan conversion mode: Enalble Continuous conversion mode: Enable Discontinuous conversion mode: Disable DMA continous requests: Enable ADC_regular_Conversionmode: Number of conversion: chọn 3 Rank 1: chọn channel 4 Rank 2: chọn channel 5 Rank 3: chọn channel 6 Trong thẻ Clock Configuration chọn như hình sau: Ngô Thanh Đông 91
  7. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU Thẻ Project manager: Project name: nhập tên project Project location: chọn nơi lưu project Toolchain/IDE: chọn MDK-ARM Ngô Thanh Đông 92
  8. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU Chọn open project: Ngô Thanh Đông 93
  9. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU 4.1.2. Chương trình mẫu: Các lệnh sử dụng trong chương trình: Khai báo biến toàn cục: volatile uint16_t adc_value[3]; uint16_t giatri_cb1, giatri_cb2,giatri_cb3; Lệnh cho phép bắt đầu chuyển đổi ADC: HAL_ADC_Start_DMA(&hadc1,(uint32_t*) adc_value,2); cho phép bắt đầu chuyển đổi adc1 có DMA. Sau khi STM chuyển đổi xong sẽ thực hiện chương trình ngắt sau: Ngô Thanh Đông 94
  10. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU Chương trình mẫu toàn code: #include "main.h" ADC_HandleTypeDef hadc1; DMA_HandleTypeDef hdma_adc1; I2C_HandleTypeDef hi2c1; DMA_HandleTypeDef hdma_i2c1_tx; /* USER CODE BEGIN PV */ volatile uint16_t adc_value[3]; uint16_t giatri_cb1, giatri_cb2,giatri_cb3; /* USER CODE END PV */ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_DMA_Init(void); static void MX_I2C1_Init(void); static void MX_ADC1_Init(void); /* USER CODE BEGIN PFP */ void lcd_send_cmd4bit (int8_t cmd); void lcd_send_cmd (char cmd); void lcd_init (void); void lcd_send_data(char chr); /* USER CODE END PFP */ int main(void) Ngô Thanh Đông 95
  11. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_I2C1_Init(); MX_ADC1_Init(); /* USER CODE BEGIN 2 */ HAL_ADC_Start_DMA(&hadc1,(uint32_t*) adc_value,2); lcd_init(); lcd_send_cmd(0x80); HAL_Delay(100); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ Ngô Thanh Đông 96
  12. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ lcd_send_cmd(0x80); lcd_send_data('A'); HAL_Delay(300); giatri_cb1= adc_value[0]; giatri_cb2= adc_value[1]; lcd_send_cmd(0xC0); lcd_send_data(giatri_cb1/1000%10+0x30); lcd_send_data(giatri_cb1/100%10+0x30); lcd_send_data(giatri_cb1/10%10+0x30); lcd_send_data(giatri_cb1/1%10+0x30); lcd_send_cmd(0xC8); lcd_send_data(giatri_cb2/1000%10+0x30); lcd_send_data(giatri_cb2/100%10+0x30); lcd_send_data(giatri_cb2/10%10+0x30); lcd_send_data(giatri_cb2/1%10+0x30); } /* USER CODE END 3 */ } Ngô Thanh Đông 97
  13. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SC ALE1); /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; Ngô Thanh Đông 98
  14. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 4; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } } /** Ngô Thanh Đông 99
  15. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU * @brief ADC1 Initialization Function * @param None * @retval None */ static void MX_ADC1_Init(void) { /* USER CODE BEGIN ADC1_Init 0 */ /* USER CODE END ADC1_Init 0 */ ADC_ChannelConfTypeDef sConfig = {0}; /* USER CODE BEGIN ADC1_Init 1 */ /* USER CODE END ADC1_Init 1 */ /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */ hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.ScanConvMode = ENABLE; hadc1.Init.ContinuousConvMode = ENABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; Ngô Thanh Đông 100
  16. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 2; hadc1.Init.DMAContinuousRequests = ENABLE; hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_4; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_84CYCLES; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_5; sConfig.Rank = 2; Ngô Thanh Đông 101
  17. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN ADC1_Init 2 */ /* USER CODE END ADC1_Init 2 */ } /** * @brief I2C1 Initialization Function * @param None * @retval None */ static void MX_I2C1_Init(void) { /* USER CODE BEGIN I2C1_Init 0 */ /* USER CODE END I2C1_Init 0 */ /* USER CODE BEGIN I2C1_Init 1 */ /* USER CODE END I2C1_Init 1 */ Ngô Thanh Đông 102
  18. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 400000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN I2C1_Init 2 */ /* USER CODE END I2C1_Init 2 */ } /** * Enable DMA controller clock */ static void MX_DMA_Init(void) { Ngô Thanh Đông 103
  19. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU /* DMA controller clock enable */ __HAL_RCC_DMA1_CLK_ENABLE(); __HAL_RCC_DMA2_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Stream6_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Stream6_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn); /* DMA2_Stream0_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn); } /** * @brief GPIO Initialization Function * @param None * @retval None */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOH_CLK_ENABLE(); Ngô Thanh Đông 104
  20. TH LẬP TRÌNH HỆ THỐNG NHÚNG STM32F407 - TDMU __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET); /*Configure GPIO pins : PD12 PD13 PD14 PD15 */ GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ void lcd_init (void) { // 4 bit initialisation HAL_Delay(100); // wait for >40ms lcd_send_cmd4bit(0x00); lcd_send_cmd4bit (0x30); Ngô Thanh Đông 105
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2