基于STM32的可遥控智能跟随小车的控制软件-源代码
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
I2C_Delay();
I2C_SCL_HIGH();/* CPU产生1个时钟*/
I2C_Delay();
I2C_SCL_LOW();
I2C_Delay();
I2C_SDA_HIGH();/* CPU释放SDA总线*/
}
/**
*函数功能: CPU产生1个NACK信号
*输入参数:无
*返回值:无
*说明:无
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(I2C_GPIO_PORT, &GPIO_InitStruct);
/*给一个停止信号,复位I2C总线上的所有设备到待机模式*/
循环次数为5时,SCL频率= 421KHz,SCL高电平时间1.25us,SCL低电平时间2.375us
IAR工程编译效率高,不能设置为7
*/
for (i = 0; i < 10; i++);
}
/**
*函数功能: CPU发起I2C总线启动信号
*输入参数:无
*返回值:无
*说明:无
*/
void I2C_Start(void)
*输入参数: Byte:等待发送的字节
*返回值:无
Leabharlann Baidu*说明:无
*/
void I2C_SendByte(uint8_t Byte)
{
uint8_t i;
/*先发送字节的高位bit7 */
for (i = 0; i < 8; i++)
{
if (Byte & 0x80)
{
I2C_SDA_HIGH();
}
else
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_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; //系统时钟:72MHz
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB时钟:72MHz
/*系统滴答定时器时钟源*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/*系统滴答定时器中断优先级配置*/
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
*函数功能: I2C总线位延迟,最快400KHz
*输入参数:无
*返回值:无
*说明:无
*/
void I2C_InitGPIO(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/*打开GPIO时钟*/
I2C_GPIO_CLK_ENABLE();
GPIO_InitStruct.Pin = I2C_SCL_PIN|I2C_SDA_PIN;
HAL_Init();
/*配置系统时钟*/
SystemClock_Config();
OLED_Init();
/*无限循环*/
while (1)
{
OLED_Fill(0xFF);//全屏点亮
HAL_Delay(2000);
OLED_Fill(0x00);//全屏灭
HAL_Delay(2000);
for(i=0;i<4;i++)
/**
******************************************************************************
*文件名程: main.c
*版本: V1.0
*
*
*/
/*包含头文件----------------------------------------------------------------*/
*输入参数:无
*返回值:读到的数据
*说明:无
*/
uint8_t I2C_ReadByte(void)
{
uint8_t i;
uint8_t value;
/*读到第1个bit为数据的bit7 */
value = 0;
for (i = 0; i < 8; i++)
{
value <<= 1;
I2C_SCL_HIGH();
I2C_Delay();
if (I2C_SDA_READ())
{
value++;
}
I2C_SCL_LOW();
I2C_Delay();
}
return value;
}
/**
*函数功能: CPU产生一个时钟,并读取器件的ACK应答信号
*输入参数:无
*返回值:返回0表示正确应答,1表示无器件响应
*说明:无
*/
uint8_t I2C_WaitAck(void)
{
uint8_t re;
I2C_SDA_HIGH();/* CPU释放SDA总线*/
I2C_Delay();
I2C_SCL_HIGH();/* CPU驱动SCL = 1,此时器件会返回ACK应答*/
I2C_Delay();
if (I2C_SDA_READ())/* CPU读取SDA口线状态*/
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);
*输入参数:无
*返回值:无
*说明:无
*/
static void I2C_Delay(void)
{
uint8_t i;
/*
下面的时间是通过逻辑分析仪测试得到的。
CPU主频72MHz时,在内部Flash运行, MDK工程不优化
循环次数为10时,SCL频率= 205KHz
循环次数为7时,SCL频率= 347KHz,SCL高电平时间1.5us,SCL低电平时间2.87us
/*私有宏定义----------------------------------------------------------------*/
/*私有变量------------------------------------------------------------------*/
extern const unsigned char BMP1[];
}
}
/**
*函数功能:系统时钟配置
*输入参数:无
*返回值:无
*说明:无
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; //外部晶振,8MHz
// HAL_RCC_GetHCLKFreq()/1000 1ms中断一次
// HAL_RCC_GetHCLKFreq()/10000010us中断一次
// HAL_RCC_GetHCLKFreq()/1000000 1us中断一次
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); //配置并启动系统滴答定时器
{
re = 1;
}
else
{
re = 0;
}
I2C_SCL_LOW();
I2C_Delay();
return re;
}
/**
*函数功能: CPU产生一个ACK信号
*输入参数:无
*返回值:无
*说明:无
*/
void I2C_Ack(void)
{
I2C_SDA_LOW();/* CPU驱动SDA = 0 */
{
/*当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号*/
I2C_SDA_HIGH();
I2C_SCL_HIGH();
I2C_Delay();
I2C_SDA_LOW();
I2C_Delay();
I2C_SCL_LOW();
I2C_Delay();
}
/**
*函数功能: CPU发起I2C总线停止信号
/*函数体--------------------------------------------------------------------*/
/**
*函数功能:主函数.
*输入参数:无
*返回值:无
*说明:无
*/
int main(void)
{
uint8_t i;
/*复位所有外设,初始化Flash接口和系统滴答定时器*/
*/
void I2C_NAck(void)
{
I2C_SDA_HIGH();/* CPU驱动SDA = 1 */
I2C_Delay();
I2C_SCL_HIGH();/* CPU产生1个时钟*/
I2C_Delay();
I2C_SCL_LOW();
I2C_Delay();
}
/**
*函数功能:配置I2C总线的GPIO,采用模拟IO的方式实现
{
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*)"www.ing10.cn",2);//测试8*16字符
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // 9倍频,得到72MHz主时钟
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
#include "stm32f1xx_hal.h"
#include "led/bsp_led.h"
#include "usart/bsp_debug_usart.h"
#include "OLED/bsp_i2c_OLED.h"
/*私有类型定义--------------------------------------------------------------*/
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // APB1时钟:36MHz
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // APB2时钟:72MHz
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
/*扩展变量------------------------------------------------------------------*/
/*私有函数原形--------------------------------------------------------------*/
void SystemClock_Config(void);
I2C_Stop();
}
/**
*函数功能:写入数据到i2c
*输入参数:无
*返回值:无
*说明:无
*/
void write_i2c(uint8_t device,uint8_t addr,uint8_t dat)
{
I2C_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数据
*输入参数:无
*返回值:无
*说明:无
*/
void I2C_Stop(void)
{
/*当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号*/
I2C_SDA_LOW();
I2C_SCL_HIGH();
I2C_Delay();
I2C_SDA_HIGH();
}
/**
*函数功能: CPU向I2C总线设备发送8bit数据
I2C_SCL_HIGH();/* CPU产生1个时钟*/
I2C_Delay();
I2C_SCL_LOW();
I2C_Delay();
I2C_SDA_HIGH();/* CPU释放SDA总线*/
}
/**
*函数功能: CPU产生1个NACK信号
*输入参数:无
*返回值:无
*说明:无
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(I2C_GPIO_PORT, &GPIO_InitStruct);
/*给一个停止信号,复位I2C总线上的所有设备到待机模式*/
循环次数为5时,SCL频率= 421KHz,SCL高电平时间1.25us,SCL低电平时间2.375us
IAR工程编译效率高,不能设置为7
*/
for (i = 0; i < 10; i++);
}
/**
*函数功能: CPU发起I2C总线启动信号
*输入参数:无
*返回值:无
*说明:无
*/
void I2C_Start(void)
*输入参数: Byte:等待发送的字节
*返回值:无
Leabharlann Baidu*说明:无
*/
void I2C_SendByte(uint8_t Byte)
{
uint8_t i;
/*先发送字节的高位bit7 */
for (i = 0; i < 8; i++)
{
if (Byte & 0x80)
{
I2C_SDA_HIGH();
}
else
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_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; //系统时钟:72MHz
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB时钟:72MHz
/*系统滴答定时器时钟源*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/*系统滴答定时器中断优先级配置*/
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
*函数功能: I2C总线位延迟,最快400KHz
*输入参数:无
*返回值:无
*说明:无
*/
void I2C_InitGPIO(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/*打开GPIO时钟*/
I2C_GPIO_CLK_ENABLE();
GPIO_InitStruct.Pin = I2C_SCL_PIN|I2C_SDA_PIN;
HAL_Init();
/*配置系统时钟*/
SystemClock_Config();
OLED_Init();
/*无限循环*/
while (1)
{
OLED_Fill(0xFF);//全屏点亮
HAL_Delay(2000);
OLED_Fill(0x00);//全屏灭
HAL_Delay(2000);
for(i=0;i<4;i++)
/**
******************************************************************************
*文件名程: main.c
*版本: V1.0
*
*
*/
/*包含头文件----------------------------------------------------------------*/
*输入参数:无
*返回值:读到的数据
*说明:无
*/
uint8_t I2C_ReadByte(void)
{
uint8_t i;
uint8_t value;
/*读到第1个bit为数据的bit7 */
value = 0;
for (i = 0; i < 8; i++)
{
value <<= 1;
I2C_SCL_HIGH();
I2C_Delay();
if (I2C_SDA_READ())
{
value++;
}
I2C_SCL_LOW();
I2C_Delay();
}
return value;
}
/**
*函数功能: CPU产生一个时钟,并读取器件的ACK应答信号
*输入参数:无
*返回值:返回0表示正确应答,1表示无器件响应
*说明:无
*/
uint8_t I2C_WaitAck(void)
{
uint8_t re;
I2C_SDA_HIGH();/* CPU释放SDA总线*/
I2C_Delay();
I2C_SCL_HIGH();/* CPU驱动SCL = 1,此时器件会返回ACK应答*/
I2C_Delay();
if (I2C_SDA_READ())/* CPU读取SDA口线状态*/
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);
*输入参数:无
*返回值:无
*说明:无
*/
static void I2C_Delay(void)
{
uint8_t i;
/*
下面的时间是通过逻辑分析仪测试得到的。
CPU主频72MHz时,在内部Flash运行, MDK工程不优化
循环次数为10时,SCL频率= 205KHz
循环次数为7时,SCL频率= 347KHz,SCL高电平时间1.5us,SCL低电平时间2.87us
/*私有宏定义----------------------------------------------------------------*/
/*私有变量------------------------------------------------------------------*/
extern const unsigned char BMP1[];
}
}
/**
*函数功能:系统时钟配置
*输入参数:无
*返回值:无
*说明:无
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; //外部晶振,8MHz
// HAL_RCC_GetHCLKFreq()/1000 1ms中断一次
// HAL_RCC_GetHCLKFreq()/10000010us中断一次
// HAL_RCC_GetHCLKFreq()/1000000 1us中断一次
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); //配置并启动系统滴答定时器
{
re = 1;
}
else
{
re = 0;
}
I2C_SCL_LOW();
I2C_Delay();
return re;
}
/**
*函数功能: CPU产生一个ACK信号
*输入参数:无
*返回值:无
*说明:无
*/
void I2C_Ack(void)
{
I2C_SDA_LOW();/* CPU驱动SDA = 0 */
{
/*当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号*/
I2C_SDA_HIGH();
I2C_SCL_HIGH();
I2C_Delay();
I2C_SDA_LOW();
I2C_Delay();
I2C_SCL_LOW();
I2C_Delay();
}
/**
*函数功能: CPU发起I2C总线停止信号
/*函数体--------------------------------------------------------------------*/
/**
*函数功能:主函数.
*输入参数:无
*返回值:无
*说明:无
*/
int main(void)
{
uint8_t i;
/*复位所有外设,初始化Flash接口和系统滴答定时器*/
*/
void I2C_NAck(void)
{
I2C_SDA_HIGH();/* CPU驱动SDA = 1 */
I2C_Delay();
I2C_SCL_HIGH();/* CPU产生1个时钟*/
I2C_Delay();
I2C_SCL_LOW();
I2C_Delay();
}
/**
*函数功能:配置I2C总线的GPIO,采用模拟IO的方式实现
{
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*)"www.ing10.cn",2);//测试8*16字符
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // 9倍频,得到72MHz主时钟
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
#include "stm32f1xx_hal.h"
#include "led/bsp_led.h"
#include "usart/bsp_debug_usart.h"
#include "OLED/bsp_i2c_OLED.h"
/*私有类型定义--------------------------------------------------------------*/
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // APB1时钟:36MHz
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // APB2时钟:72MHz
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
/*扩展变量------------------------------------------------------------------*/
/*私有函数原形--------------------------------------------------------------*/
void SystemClock_Config(void);
I2C_Stop();
}
/**
*函数功能:写入数据到i2c
*输入参数:无
*返回值:无
*说明:无
*/
void write_i2c(uint8_t device,uint8_t addr,uint8_t dat)
{
I2C_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数据
*输入参数:无
*返回值:无
*说明:无
*/
void I2C_Stop(void)
{
/*当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号*/
I2C_SDA_LOW();
I2C_SCL_HIGH();
I2C_Delay();
I2C_SDA_HIGH();
}
/**
*函数功能: CPU向I2C总线设备发送8bit数据