




已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
48/* * * 文件名程: main.c * 版 本: V1.0 * * */* 包含头文件 -*/#include stm32f1xx_hal.h#include led/bsp_led.h#include usart/bsp_debug_usart.h#include OLED/bsp_i2c_OLED.h/* 私有类型定义 -*/* 私有宏定义 -*/* 私有变量 -*/extern const unsigned char BMP1;/* 扩展变量 -*/* 私有函数原形 -*/void SystemClock_Config(void);/* 函数体 -*/* * 函数功能: 主函数. * 输入参数: 无 * 返 回 值: 无 * 说 明: 无 */int main(void) uint8_t i; /* 复位所有外设,初始化Flash接口和系统滴答定时器 */ HAL_Init(); /* 配置系统时钟 */ SystemClock_Config(); OLED_Init(); /* 无限循环 */ while (1) OLED_Fill(0xFF);/全屏点亮 HAL_Delay(2000); OLED_Fill(0x00);/全屏灭 HAL_Delay(2000); for(i=0;i4;i+) OLED_ShowCN(30+i*16,0,i);/测试显示中文 HAL_Delay(2000); OLED_ShowStr(0,3,(unsigned char*)OLED 0.96inch 12864,1);/测试6*8字符 OLED_ShowStr(10,5,(unsigned char*),2);/测试8*16字符 HAL_Delay(2000); OLED_CLS();/清屏 OLED_OFF();/测试OLED休眠 HAL_Delay(2000); OLED_ON();/测试OLED休眠后唤醒 OLED_DrawBMP(0,0,128,8,(unsigned char *)BMP1);/测试BMP位图显示 HAL_Delay(20000); /* * 函数功能: 系统时钟配置 * 输入参数: 无 * 返 回 值: 无 * 说 明: 无 */void SystemClock_Config(void) RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; / 外部晶振,8MHz RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; / 9倍频,得到72MHz主时钟 HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; / 系统时钟:72MHz RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; / AHB时钟:72MHz RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; / APB1时钟:36MHz RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; / APB2时钟:72MHz HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2); / HAL_RCC_GetHCLKFreq()/1000 1ms中断一次/ HAL_RCC_GetHCLKFreq()/100000 10us中断一次/ HAL_RCC_GetHCLKFreq()/1000000 1us中断一次 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); / 配置并启动系统滴答定时器 /* 系统滴答定时器时钟源 */ HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* 系统滴答定时器中断优先级配置 */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);* 函数功能: I2C总线位延迟,最快400KHz * 输入参数: 无 * 返 回 值: 无 * 说 明:无 */static void I2C_Delay(void)uint8_t i;/* 下面的时间是通过逻辑分析仪测试得到的。CPU主频72MHz时,在内部Flash运行, MDK工程不优化循环次数为10时,SCL频率 = 205KHz 循环次数为7时,SCL频率 = 347KHz, SCL高电平时间1.5us,SCL低电平时间2.87us 循环次数为5时,SCL频率 = 421KHz, SCL高电平时间1.25us,SCL低电平时间2.375us IAR工程编译效率高,不能设置为7*/for (i = 0; i 10; i+);/* * 函数功能: CPU发起I2C总线启动信号 * 输入参数: 无 * 返 回 值: 无 * 说 明:无 */void I2C_Start(void)/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */I2C_SDA_HIGH();I2C_SCL_HIGH();I2C_Delay();I2C_SDA_LOW();I2C_Delay();I2C_SCL_LOW();I2C_Delay();/* * 函数功能: CPU发起I2C总线停止信号 * 输入参数: 无 * 返 回 值: 无 * 说 明:无 */void I2C_Stop(void)/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */I2C_SDA_LOW();I2C_SCL_HIGH();I2C_Delay();I2C_SDA_HIGH();/* * 函数功能: CPU向I2C总线设备发送8bit数据 * 输入参数: Byte : 等待发送的字节 * 返 回 值: 无 * 说 明:无 */void I2C_SendByte(uint8_t Byte)uint8_t i;/* 先发送字节的高位bit7 */for (i = 0; i 8; i+)if (Byte & 0x80)I2C_SDA_HIGH();elseI2C_SDA_LOW();I2C_Delay();I2C_SCL_HIGH();I2C_Delay();I2C_SCL_LOW();if (i = 7)I2C_SDA_HIGH(); / 释放总线Byte = 1;/* 左移一个bit */I2C_Delay();/* * 函数功能: CPU从I2C总线设备读取8bit数据 * 输入参数: 无 * 返 回 值: 读到的数据 * 说 明:无 */uint8_t I2C_ReadByte(void)uint8_t i;uint8_t value;/* 读到第1个bit为数据的bit7 */value = 0;for (i = 0; i 8; i+)value 4)|0x10);WriteCmd(x&0x0f)|0x01); /* * brief OLED_Fill,填充整个屏幕 * param fill_Data:要填充的数据* retval 无 */void OLED_Fill(unsigned char fill_Data)/全屏填充unsigned char m,n;for(m=0;m8;m+)WriteCmd(0xb0+m);/page0-page1WriteCmd(0x00);/low column start addressWriteCmd(0x10);/high column start addressfor(n=0;n 126)x = 0;y+;OLED_SetPos(x,y);for(i=0;i 120)x = 0;y+;OLED_SetPos(x,y);for(i=0;i8;i+)WriteDat(F8X16c*16+i);OLED_SetPos(x,y+1);for(i=0;i8;i+)WriteDat(F8X16c*16+i+8);x += 8;j+;break; /* * brief OLED_ShowCN,显示codetab.h中的汉字,16*16点阵 * param x,y: 起始点坐标(x:0127, y:07); *N:汉字在codetab.h中的索引* retval 无 */void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)unsigned char wm=0;unsigned int adder=32*N;OLED_SetPos(x , y);for(wm = 0;wm 16;wm+)WriteDat(F16x16adder);adder += 1;OLED_SetPos(x,y + 1);for(wm = 0;wm 16;wm+)WriteDat(F16x16adder);adder += 1; /* * brief OLED_DrawBMP,显示BMP位图 * param x0,y0 :起始点坐标(x0:0127, y0:07);*x1,y1 : 起点对角线(结束点)的坐标(x1:1128,y1:18)* retval 无 */void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP)unsigned int j=0;unsigned char x,y; if(y1%8=0)y = y1/8; elsey = y1/8 + 1;for(y=y0;yy1;y+)OLED_SetPos(x0,y); for(x=x0;xInstance=DEBUG_USARTx) /* 串口外设时钟使能 */ DEBUG_USART_RCC_CLK_ENABLE(); /* 串口外设功能GPIO配置 */ GPIO_InitStruct.Pin = DEBUG_USARTx_Tx_GPIO_PIN; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(DEBUG_USARTx_Tx_GPIO, &GPIO_InitStruct); GPIO_InitStruct.Pin = DEBUG_USARTx_Rx_GPIO_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(DEBUG_USARTx_Rx_GPIO, &GPIO_InitStruct); /* * 函数功能: 串口硬件反初始化配置 * 输入参数: huart:串口句柄类型指针 * 返 回 值: 无 * 说 明: 该函数被HAL库内部调用 */void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) if(huart-Instance=DEBUG_USARTx) /* 串口外设时钟禁用 */ DEBUG_USART_RCC_CLK_DISABLE(); /* 串口外设功能GPIO配置 */ HAL_GPIO_DeInit(DEBUG_USARTx_Tx_GPIO, DEBUG_USARTx_Tx_GPIO_PIN); HAL_GPIO_DeInit(DEBUG_USARTx_Rx_GPIO, DEBUG_USARTx_Rx_GPIO_PIN); /* 串口中断禁用 */ HAL_NVIC_DisableIRQ(DEBUG_USART_IRQn); /* * 函数功能: 串口参数配置. * 输入参数: 无 * 返 回 值: 无 * 说 明:无 */void MX_DEBUG_USART_Init(void) /* 使能串口功能引脚GPIO时钟 */ DEBUG_USARTx_GPIO_ClK_ENABLE(); husart_debug.Instance = DEBUG_USARTx; husart_debug.Init.BaudRate = DEBUG_USARTx_BAUDRATE; husart_debug.Init.WordLength = UART_WORDLENGTH_9B; husart_debug.Init.StopBits = UART_STOPBITS_1; husart_debug.Init.Parity = UART_PARITY_EVEN; husart_debug.Init.Mode = UART_MODE_TX_RX; husart_debug.Init.HwFlowCtl = UART_HWCONTROL_NONE; husart_debug.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&husart_debug); /* * 函数功能: 重定向c库函数printf到DEBUG_USARTx * 输入参数: 无 * 返 回 值: 无 * 说 明:无 */int fputc(int ch, FILE *f) HAL_UART_Transmit(&husart_debug, (uint8_t *)&ch, 1, 0xffff); return ch;/* * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx * 输入参数: 无 * 返 回 值: 无 * 说 明:无 */int fgetc(FILE * f) uint8_t ch = 0; HAL_UART_Receive(&husart_debug,&ch, 1, 0xffff); return ch;/* * * File Name : stm32f1xx_hal_msp.c * Description : This file provides code for the MSP Initialization * and de-Initialization codes. * * HAL_NVIC_SetPriority(MemoryManagement_IRQn, 0, 0); /* BusFault_IRQn interrupt configuration */ HAL_NVIC_SetPriority(BusFault_IRQn, 0, 0); /* UsageFault_IRQn interrupt configuration */ HAL_NVIC_SetPriority(UsageFault_IRQn, 0, 0); /* DebugMonitor_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DebugMonitor_IRQn, 0, 0); /* SysTick_IRQn interrupt configuration */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); /* USER CODE BEGIN MspInit 1 */ /* USER CODE END MspInit 1 */* USER CODE BEGIN 1 */* USER CODE END 1 */* * */* * */* * * file stm32f1xx_it.c * brief Interrupt Service Routines. * * */* Includes -*/#include stm32f1xx_hal.h#include stm32f1xx.h#include stm32f1xx_it.h/* USER CODE BEGIN 0 */* USER CODE END 0 */* External variables -*/*/* Cortex-M3 Processor Interruption and Exception Handlers */ /*/* brief This function handles Non maskable interrupt.*/void NMI_Handler(void) /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ /* USER CODE END NonMaskableInt_IRQn 0 */ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ /* USER CODE END NonMaskableInt_IRQn 1 */* brief This function handles Hard fault interrupt.*/void HardFault_Handler(void) /* USER CODE BEGIN HardFault_IRQn 0 */ /* USER CODE END HardFault_IRQn 0 */ while (1) /* USER CODE BEGIN HardFault_IRQn 1 */ /* USER CODE END HardFault_IRQn 1 */* brief This function handles Memory management fault.*/void MemManage_Handler(void) /* USER CODE BEGIN MemoryManagement_IRQn 0 */ /* USER CODE END MemoryManagement_IRQn 0 */ while (1) /* USER CODE BEGIN MemoryManagement_IRQn 1 */ /* USER CODE END MemoryManagement_IRQn 1 */* brief This function handles Prefetch fault, memory access fault.*/void BusFault_Handler(void) /* USER CODE BEGIN BusFault_IRQn 0 */ /* USER CODE END BusFault_IRQn 0 */ while (1) /* USER CODE BEGIN BusFault_IRQn 1 */ /*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论