STM32学习之I2C

2019-04-02来源: eefocus 关键字:STM32  I2C
137        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
138        /* 选择SYSCLK时钟源为PLL */
139        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
140        /* 等待PLL成为SYSCLK时钟源 */
141        while(RCC_GetSYSCLKSource() != 0x08);
142    } 
143    /* 打开APB2总线上的GPIOA时钟*/
144    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_USART1, ENABLE);
145
146    //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
147
148    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1|RCC_APB1Periph_I2C2,ENABLE);
149    //RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP|RCC_APB1Periph_WWDG|RCC_APB1Periph_SPI2, ENABLE);
150
151}
152
153
154void USART_Configuration(void)
155{
156    USART_InitTypeDef USART_InitStructure;
157    USART_ClockInitTypeDef USART_ClockInitStructure;
158
159    USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
160    USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
161    USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;                                                                                                                                                      
162    USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
163    USART_ClockInit(USART1 , &USART_ClockInitStructure);
164
165    USART_InitStructure.USART_BaudRate = 9600;
166    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
167    USART_InitStructure.USART_StopBits = USART_StopBits_1;
168    USART_InitStructure.USART_Parity = USART_Parity_No;
169    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
170    USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
171    USART_Init(USART1,&USART_InitStructure);
172
173    USART_Cmd(USART1,ENABLE);
174}
175
176#if  PRINTF_ON
177
178int fputc(int ch,FILE *f)
179{
180    USART_SendData(USART1,(u8) ch);
181    while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
182    return ch;
183}
184
185#endif

stm32f10x_it.c


01#include "stm32f10x_it.h"
02#include "stdio.h"
03
04extern u32 BufferSize ;
05extern u8 I2C1_ADDRESS ;
06extern u8 I2C2_ADDRESS ;
07
08extern vu8 I2C1_Buffer_Tx[];
09extern vu8 I2C2_Buffer_Rx[];
10vu32 Tx_Counter = 0;
11vu32 Rx_Counter = 0;
12
13void I2C1_EV_IRQHandler(void)
14{
15    switch(I2C_GetLastEvent(I2C1))
16    {
17        case I2C_EVENT_MASTER_MODE_SELECT: //已发送启始条件
18        {
19            I2C_Send7bitAddress(I2C1,I2C2_ADDRESS,I2C_Direction_Transmitter);   
20            break;
21        }
22        case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED: //已发送从机地址
23        {
24            printf("\r\n The I2C1 has send data %d \r\n",I2C1_Buffer_Tx[Rx_Counter]);
25            I2C_SendData(I2C1,I2C1_Buffer_Tx[Tx_Counter++]);
26            break;
27        }
28        case I2C_EVENT_MASTER_BYTE_TRANSMITTED: //第一个数据已发送
29        {
30            if(Tx_Counter
31            {
32                printf("\r\n The I2C1 has send data %d \r\n",I2C1_Buffer_Tx[Rx_Counter]);
33                I2C_SendData(I2C1,I2C1_Buffer_Tx[Tx_Counter++]);                
34
35            }else{
36                I2C_GenerateSTOP(I2C1,ENABLE);
37                I2C_ITConfig(I2C1,I2C_IT_EVT|I2C_IT_BUF,DISABLE);  //计数发送的个数
38            }
39
40            break;
41        }
42        default: {break;}
43    }
44}
45
46
47void I2C2_EV_IRQHandler(void)
48{
49    switch(I2C_GetLastEvent(I2C2))
50    {
51        case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: //收到匹配的地址数据
52        {
53            break;
54        }
55        case I2C_EVENT_SLAVE_BYTE_RECEIVED: //收到数据
56        {   
57            if(Rx_Counter < BufferSize )
58            {
59                I2C2_Buffer_Rx[Rx_Counter] = I2C_ReceiveData(I2C2);
60                printf("\r\n The I2C2 has received data %d \r\n",I2C2_Buffer_Rx[Rx_Counter++]); //计数收到的个数               
61            }
62            break;
63        }
64        case I2C_EVENT_SLAVE_STOP_DETECTED: //收到结束条件
65        {
66            I2C_ClearFlag(I2C2,I2C_FLAG_STOPF);
67            I2C_ITConfig(I2C1,I2C_IT_EVT|I2C_IT_BUF,DISABLE);
68
69            break;
70        }
71        default: {break;}
72    }
73}


[1] [2] [3] [4]

关键字:STM32  I2C

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/2019/ic-news040243677_4.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32 IIC 详解 之 stm32 IIC 从机模式
下一篇:最后一页

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32Cube 工具说明和安装浅析

1、STM32CubeMX 简介说明STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,允许用户使用图形化向导生成C 初始化代码,可以大大减轻开发工作,时间和费用。STM32CubeMX几乎覆盖了STM32 全系列芯片。它具有如下特性:1)直观的选择MCU 型号,可指定系列、封装、外设数量等条件;2)微控制器图形化配置;3)自动处理引脚冲突;4)动态设置时钟树,生成系统时钟配置代码;5)可以动态设置外围和中间件模式和初始化;6)功耗预测;7)C 代码工程生成器覆盖了STM32 微控制器初始化编译软件,如IAR, KEIL,GCC;8)可以独立使用或者作为Eclipse 插件使用
发表于 2019-04-01

STM32 编译结果 map 之 code、RO-data、RW-data、ZI-data 字段解析

1、Code即代码域,它指的是编译器生成的机器指令,这些内容被存储到ROM区。2、RO-dataRead Only data,即只读数据域,它指程序中用到的只读数据,这些数据被存储在ROM区,因而程序不能修改其内容。例如:C语言中const关键字定义的变量就是典型的RO-data。3、RW-dataRead Write data,即可读写数据域,它指初始化为“非0值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。例如:C语言中使用定义的全局变量,且定义时赋予“非0值”给该变量进行初始化。4、ZI-dataZero Initialie data,即0初始化数据
发表于 2019-04-01

STM32 结构体位域操作 (int a:4)

本身的长度,比如int类型就能超过32位二进位。3)位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:     struct k     {     int a:1     int :2 /*该2位不能使用*/     int b:3     int c:2     };  从以上分析可以看出,位域在本质上就是一种结构类型,不过其成员是按二进位分配的。   
发表于 2019-04-01

STM32 分散加载文件 .sct 解析

1、STM32 启动文件与 .sct 文件分析1) 定义STACK段,{NOINIT,读写}:分配一段内存大小为0.5K;2) 定义HEAP段, {NOINIT,读写}:分配一段内存大小为1K;3) 定义RESET段,{DATA,只读}:DCD各种中断向量;4) 定义|.text|段,{CODE,只读}:Reset_Handler函数,函数中最后加载了__main;对剩余的中断函数进行了弱定义;在最后还有一段用户初始化堆栈的代码__user_initial_stackheap。那这些代码都存放在什么位置呢?5) 分析 .sct 文件:分散加载文件(即scatter file,后缀为.scf)。分散加载文件是一个文本文件,通过编写
发表于 2019-04-01

STM32 启动代码 __main 与用户主程序 main() 的区别

了。startup.s 这个文件并没有所谓的"段拷贝"功能。对含有启动程序来说,"执行地址与加载地址相同"不容易实现:如果执行地址与加载地址相同哪当然不需要做"段拷贝",但是个人理解编译器还会加入"段拷贝"程序(如果用B __main 的话),只是因为条件不满足而不执行而已;但是对含有启动程序来说,"执行地址与加载地址相同"就不容易了.因为启动程序是要烧到非易失存储器里,用来在上电执行的,而这个程序必定会有RW段,如果RW放在非易失存储器,如FLASH,那就不好实现RW功能了,因此要给RW移动到能够实现RW功能的存储器,如SRAM
发表于 2019-04-01
STM32 启动代码 __main 与用户主程序 main() 的区别

STM32 启动代码分析详解

__main就好了;c),虽然通过读标准的CMSIS汇编启动代码也可以知道堆栈是怎样初始化的。以LPC54608为例,早期的芯片会有不同的处理方式,比如大家都很熟悉的STM32F103系列,是需要启动代码与分散加载配合完成的。3.1、异常&中断向量表之前我们说这个可以用数组来实现,普通数组肯定不行,因为这些向量的本质是中断服务函数的入口,也就是“函数指针”所以这个数组必须得是函数指针数组:所以我们先声明一个函数指针类型:typedef void ( *__vector )( void );然后定义一个函数指针型数组取名为__vector_table:__vector __vector_table[] = {};   
发表于 2019-04-01
STM32 启动代码分析详解
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved