|
因为需要,最近新花了40元买了一块STM32F103C8T6的小型开发板。早在网站就听说系统工程生成器STM32Cudemx,借实验这块小开发板尝试这款软件试试。软件是早就下载了并且安装了,但没有用,因此版本是4.19.0的。因为网上已有较详细的使用介绍,本实验不在进行介绍。 开始比较简单,按照默认的,只是打开了GPIO口来测试班子的好坏——以为是二手的,去掉快递费应该只有30元吧。将板上所有印字的IO口都做了输出实验,连接双向二极管测好坏,一会就完成了。之后测试LCD驱显,采用无背光的KS0713LCD。默认的时钟就是8MHz,结果LCD刷屏明显,看手册F103有PLL,就想将他的SysClock升高,起码不闪屏就好,结果多次摸索,结果看图11。按照图11,选择为内部时钟,倍频16倍得到64MHz,USB是不能用了,因为USB时钟最低除以1.5还是超了,于是关掉USB。其他的各项筛选后都没有红色警告了,见图11。 GPIO的选择见图12,设置了3路Timer,其中1个外部输入2路PWM,1路输出控制、2路ADC分别1+3个通道、1路I2C、1路USART、看门狗,还有PB_0,1,2,9,10,11,其中PB_9是测试LED。 本实验主要是完成驱显,而后逐步完成设置的内容。KS0713的所有驱动创建了一个0713.h文档,保存在incs文件夹下,内容如下: #include "main.h" #include "stm32f1xx_hal.h" //KS0713 LCD const unsigned char asc2[][6]={//8x8 Dots 32-126[0-94] {0x00,0x3E,0x45,0x49,0x51,0x3E},//0 {0x00,0x00,0x21,0x7F,0x01,0x00},//1 {0x00,0x31,0x43,0x45,0x49,0x31},//2 {0x00,0x22,0x49,0x49,0x49,0x36},//3 {0x00,0x04,0x0C,0x14,0x7F,0x04},//4 {0x00,0x72,0x51,0x51,0x51,0x4E},//5-5 {0x00,0x3E,0x49,0x49,0x49,0x06},//6 {0x00,0x40,0x43,0x4C,0x50,0x60},//7 {0x00,0x36,0x49,0x49,0x49,0x36},//8 {0x00,0x30,0x48,0x48,0x48,0x3F},//9 {0x00,0x1F,0x24,0x64,0x24,0x1F},//A-10 {0x00,0x41,0x7F,0x49,0x49,0x36},//B {0x00,0x3E,0x41,0x41,0x41,0x22},//C {0x00,0x41,0x7F,0x41,0x41,0x3E},//D {0x00,0x41,0x7F,0x49,0x49,0x63},//E {0x00,0x41,0x7F,0x49,0x5C,0x60},//F-15 {0x00,0x3E,0x41,0x45,0x47,0x24},//G {0x41,0x7F,0x08,0x08,0x08,0x7F},//H {0x00,0x00,0x41,0x7F,0x41,0x00},//I {0x00,0x42,0x41,0x7F,0x40,0x40},//J {0x00,0x41,0x7F,0x59,0x24,0x43},//K-20 {0x00,0x40,0x7F,0x41,0x01,0x03},//L {0x00,0x7F,0x20,0x1E,0x20,0x7F},//M {0x00,0x7F,0x30,0x18,0x06,0x7F},//N {0x00,0x3E,0x41,0x41,0x41,0x3E},//O {0x00,0x41,0x7F,0x49,0x48,0x30},//P-25 {0x00,0x3E,0x41,0x47,0x42,0x3D},//Q {0x00,0x41,0x7F,0x49,0x4C,0x33},//R {0x00,0x32,0x49,0x49,0x49,0x26},//S {0x00,0x60,0x41,0x7F,0x41,0x60},//T {0x00,0x7E,0x01,0x01,0x01,0x7E},//U-30 {0x00,0x7C,0x02,0x01,0x02,0x7C},//V {0x00,0x7C,0x03,0x3C,0x03,0x7C},//W {0x00,0x43,0x24,0x18,0x24,0x43},//X {0x00,0x60,0x18,0x07,0x18,0x60},//Y {0x00,0x63,0x45,0x49,0x51,0x63},//Z-35 {0x00,0x00,0x00,0x01,0x00,0x00},//. {0x00,0x14,0x14,0x14,0x14,0x14},//= {0x00,0x08,0x08,0x3E,0x08,0x08},//+ {0x00,0x08,0x08,0x08,0x08,0x08},//- {0x00,0x00,0x00,0x24,0x00,0x00},//:-40 }; //Write Plus void wri(void){ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET); } //a B Data to LCD,dt:data,com:1-dat/0-com//1=clk,2=dat,3=reg,4=res void b2l(unsigned char dt,unsigned char com){ unsigned char i; HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); if(com)HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);; for(i=0;i<8;i++){ if(dt&0x80){HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET);}else{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_RESET);}; dt=dt<<1; wri(); } HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET); } //Set LCD X:0-102 Y:0-3 void setXY(unsigned char pag,unsigned char col){ b2l(0xB0+pag,0);//page //col+=0x04;//+4-->4bit b2l(0x12+((col&0x70)>>4),0);//如果反着,0x10+ b2l(col&0x0F,0);//row-L4 } //LCD Clear void lcdClear(void){ unsigned char pag,col; for(pag=0;pag<8;pag++){ setXY(pag,0); for(col=0;col<132;col++){b2l(0x00,1);}; } } //c:Char,cha[] void c2l(unsigned char pag,unsigned char col,unsigned char c){ unsigned char line; setXY(pag,col*6);//6 for (line=0;line<6;line++)//6 b2l(asc2[c][line],1); } //KS0713LCD Initial void lcdInit(void){ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET); HAL_Delay(10); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET); HAL_Delay(10); b2l(0xAE,0);//AE=关闭显示/AF=开显示 b2l(0xE2,0);//LCD初始化 b2l(0xA0,0);//刷新行顺序A0=1~132列/A1=132~1 b2l(0xC0,0);//刷新纵顺序C0=1~64行/C8=64~1 b2l(0xA2,0);//A2=1/65=1/7__A3=1/65=1/9速率 b2l(0x2F,0);//电源模式28+VC+VR+VF HAL_Delay(1); b2l(0x23,0);//20~27=1.9,2.19,2.55,3.02,3.61,4.35,5.29,6.48V/偏压 HAL_Delay(1); b2l(0x81,0);//V0电压,后跟参数 b2l(0x2C,0);//000000~111111=0~63=8.83~11.17V/30=10V HAL_Delay(1); b2l(0xAD,0);//AC=关闭游标/AD=打开游标 b2l(0x00,0);//跟上00=OFF/01=1S/02=0.5S/03=AllOn b2l(0xAF,0);//开始显示 HAL_Delay(10); } //0713 Display ASCII Test void dispAsc(void){ int i,j,k=0; for(i=0;i<4;i++){ for(j=0;j<16;j++){ c2l(i,j,k); if(k>39){k=0;}else{k++;} } } } //END Files// main主函数内容如下[许多是自己生成的,还没有改,一些说明在这里删除了,可以减少一点]: /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "stm32f1xx_hal.h" #include "0713.h" /* Private variables ---------------------------------------------------------*/ ADC_HandleTypeDef hadc1; ADC_HandleTypeDef hadc2; I2C_HandleTypeDef hi2c1; TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim3; UART_HandleTypeDef huart1; WWDG_HandleTypeDef hwwdg; /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); void Error_Handler(void); static void MX_GPIO_Init(void); static void MX_ADC1_Init(void); static void MX_ADC2_Init(void); static void MX_I2C1_Init(void); static void MX_TIM1_Init(void); static void MX_TIM2_Init(void); static void MX_TIM3_Init(void); static void MX_USART1_UART_Init(void); static void MX_WWDG_Init(void); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); uint32_t js; uint16_t val0,val1,val2,val3,pwmdir0=1,pwmdir1=1,duty,dut0=900,dut1=800,ddu0=3,ddu1=4; //LED Test Program void led(void){ if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)) HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET); else HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET); } //Display BaseData void dispBase(void){ c2l(3,0,19);c2l(3,1,28);c2l(3,2,26);c2l(3,3,40);//JSQ: c2l(2,0,10);c2l(2,1,0);c2l(2,8,10);c2l(2,9,1);//A0A1: c2l(1,0,25);c2l(1,1,32);c2l(1,2,22);//PWM c2l(1,8,25);c2l(1,9,32);c2l(1,10,22);//PWM } //Disp Meseger void dispMes(void){ c2l(3,4,(js/100000)%10);c2l(3,5,(js/10000)%10);c2l(3,6,(js/1000)%10);c2l(3,7,(js/100)%10);c2l(3,8,(js/10)%10);c2l(3,9,(js)%10); c2l(2,3,(val0/1000)%10);c2l(2,4,(val0/100)%10);c2l(2,5,(val0/10)%10);c2l(2,6,(val0)%10); c2l(2,11,(val1/1000)%10);c2l(2,12,(val1/100)%10);c2l(2,13,(val1/10)%10);c2l(2,14,(val1)%10); c2l(1,4,(dut0/100)%10);c2l(1,5,(dut0/10)%10);c2l(1,6,(dut0)%10); c2l(1,12,(dut1/100)%10);c2l(1,13,(dut1/10)%10);c2l(1,14,(dut1)%10); } // int main(void){ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_ADC1_Init(); MX_ADC2_Init(); MX_I2C1_Init(); MX_TIM1_Init(); MX_TIM2_Init(); MX_TIM3_Init(); MX_USART1_UART_Init(); MX_WWDG_Init(); lcdInit(); lcdClear(); dispBase(); while (1){ js++; dispMes(); led(); HAL_Delay(10); } } /** System Clock Configuration */ void SystemClock_Config(void){ RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_PeriphCLKInitTypeDef PeriphClkInit; /**Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = 16; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){ Error_Handler(); } /**Initializes the CPU, AHB and APB busses 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_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){ Error_Handler(); } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC; PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV8; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){ Error_Handler(); } /**Configure the Systick interrupt time*/ HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); /**Configure the Systick */ HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt configuration */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /* ADC1 init function */ static void MX_ADC1_Init(void){ ADC_ChannelConfTypeDef sConfig; /**Common config */ hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 1; if (HAL_ADC_Init(&hadc1) != HAL_OK){ Error_Handler(); } /**Configure Regular Channel*/ sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){ Error_Handler(); } } /* ADC2 init function */ static void MX_ADC2_Init(void){ ADC_ChannelConfTypeDef sConfig; /**Common config */ hadc2.Instance = ADC2; hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE; hadc2.Init.ContinuousConvMode = DISABLE; hadc2.Init.DiscontinuousConvMode = DISABLE; hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc2.Init.NbrOfConversion = 1; if (HAL_ADC_Init(&hadc2) != HAL_OK){ Error_Handler(); } /**Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK){ Error_Handler(); } } /* I2C1 init function */ static void MX_I2C1_Init(void){ hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; 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(); } } /* TIM1 init function */ static void MX_TIM1_Init(void){ TIM_ClockConfigTypeDef sClockSourceConfig; TIM_SlaveConfigTypeDef sSlaveConfig; TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 0; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; if (HAL_TIM_Base_Init(&htim1) != HAL_OK){ Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK){ Error_Handler(); } if (HAL_TIM_OC_Init(&htim1) != HAL_OK){ Error_Handler(); } sSlaveConfig.SlaveMode = TIM_SLAVEMODE_DISABLE; sSlaveConfig.InputTrigger = TIM_TS_ITR0; if (HAL_TIM_SlaveConfigSynchronization(&htim1, &sSlaveConfig) != HAL_OK){ Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK){ Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_TIMING; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; if (HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){ Error_Handler(); } sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime = 0; sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK){ Error_Handler(); } } /* TIM2 init function */ static void MX_TIM2_Init(void){ TIM_SlaveConfigTypeDef sSlaveConfig; TIM_MasterConfigTypeDef sMasterConfig; htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 0; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { Error_Handler(); } sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1; sSlaveConfig.InputTrigger = TIM_TS_ETRF; sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_NONINVERTED; sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1; sSlaveConfig.TriggerFilter = 0; if (HAL_TIM_SlaveConfigSynchronization(&htim2, &sSlaveConfig) != HAL_OK){ Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK){ Error_Handler(); } } /* TIM3 init function */ static void MX_TIM3_Init(void){ TIM_SlaveConfigTypeDef sSlaveConfig; TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; htim3.Instance = TIM3; htim3.Init.Prescaler = 0; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 0; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_Base_Init(&htim3) != HAL_OK){ Error_Handler(); } if (HAL_TIM_PWM_Init(&htim3) != HAL_OK){ Error_Handler(); } sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1; sSlaveConfig.InputTrigger = TIM_TS_ITR1; if (HAL_TIM_SlaveConfigSynchronization(&htim3, &sSlaveConfig) != HAL_OK){ Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK){ Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){ Error_Handler(); } if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK){ Error_Handler(); } HAL_TIM_MspPostInit(&htim3); } /* USART1 init function */ static void MX_USART1_UART_Init(void){ huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_MultiProcessor_Init(&huart1, 0, UART_WAKEUPMETHOD_IDLELINE) != HAL_OK){ Error_Handler(); } } /* WWDG init function */ static void MX_WWDG_Init(void){ hwwdg.Instance = WWDG; hwwdg.Init.Prescaler = WWDG_PRESCALER_1; hwwdg.Init.Window = 64; hwwdg.Init.Counter = 64; if (HAL_WWDG_Init(&hwwdg) != HAL_OK){ Error_Handler(); } } static void MX_GPIO_Init(void){ GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11, GPIO_PIN_RESET); /*Configure GPIO pins : PD0 PD1 */ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /*Configure GPIO pins : PB0 PB1 PB2 PB_9 PB10 PB11 */ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure peripheral I/O remapping */ __HAL_AFIO_REMAP_PD01_ENABLE(); } void Error_Handler(void){ /* USER CODE BEGIN Error_Handler */ /* User can add his own implementation to report the HAL error return state */ while(1){ } /* USER CODE END Error_Handler */ } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t* file, uint32_t line){ /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif 小开发板没有下载仿真接口,只能借助于其他STM开发板的SWD下载程序,下载前还需要按下Reset键,硬件连接见照片13。编译下载后的结果见照片14。 |
11-SysClock设置
12-其他功能模块设置选择
13-硬件连接
14-显示效果还可以
| 学习一下103 |
| 谢谢分享 |
| 周末愉快!谢谢分享。 |
| 有LCD显示就有很多好玩的,不错,攒一个。 |
| 谢谢分享!!! |
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版