完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
这篇文章主要介绍了STM32F103C8T6实现通信通信+邻点灯(示例代码)以及相关的技巧技巧,文章约34016字,浏览量545,点赞数2,值得参考!
1、实现的效果 芯片复位,串口调试助手打印出: 芯片的唯一ID为:67075433-49568770-670FF52 芯片flash的容量为:64K 按下S2,灯萤,同时打印OK 在双手命令端,发出命令,打印该命令 2、main.c /* ***************************************** * 文件名:main.c *描述:通过串口调试软件,向板子发送数据,板子接收到数据后,立即回传给电脑。 * 实验平台:MINI STM32开发板基于STM32F103C8T6 * 库版本:ST3.0.0 ****************************************************** ****** */#include " includes.h "extern u32 ChipUniqueID[ 3 ];extern void bsp_Init( void );int main(空){ 系统初始化(); //配置系统 log为72M bsp_Init(); //配置初始化 printf( "芯片的唯一ID为:%X-%X-%X" , ChipUniqueID[ 0 ],ChipUniqueID[ 1 ],ChipUniqueID[ 2 ]); /*输出芯片容量*/ printf( "芯片flash的容量为:%dK " , *(__IO u16 *)( 0X1FFFF7E0 )); 而( 1 ) { if ( Key_Scan(GPIOA,GPIO_Pin_0) == KEY_ON ) //判断KEY1 是否按下 { GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)(( 1 -GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13))); // LED1荧光 printf( "好的" ); } }}3、app.c #include " app.h " u32 ChipUniqueID[ 3 ];/* 获取芯片ID */ void Get_ChipID( void ){ ChipUniqueID[ 0 ] = *(__IO u32 *)( 0X1FFFF7F0 ); //高字节 ChipUniqueID[ 1 ] = *(__IO u32 *)( 0X1FFFF7EC ); // ChipUniqueID[ 2 ] = *(__IO u32 *)( 0X1FFFF7E8 ); //低字节}/*描述:生成c库函数printf到USART1 */ int fputc( int ch, FILE * f){/*将Printf内容发往串口*/ USART_SendData(USART1, (unsigned char ) ch); 而(!(USART1->SR & USART_FLAG_TXE)); 返回(ch);} /*不合理的*/ void Delay(__IO u32 nCount){ for (; nCount != 0 ; nCount-- );} /*检测是否有按键按下*/ u8 Key_Scan(GPIO_TypeDef * GPIOx,u16 GPIO_Pin){ /*检测是否有按键按下*/ if (GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON ) { /*要消抖*/ Delay( 50000 ); if (GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON ) { /*等待用户释放*/ while (GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON); 返回 KEY_ON; } 否则 返回KEY_OFF; } 否则 返回KEY_OFF;}4、app.h #ifndef __APP_H__ #define __APP_H__#include " includes.h " #define KEY_ON 0 #define KEY_OFF 1 void Get_ChipID( void );无效延迟(__IO u32 nCount);u8 Key_Scan(GPIO_TypeDef * GPIOx,u16 GPIO_Pin);#万一5、bsp.c #include " bsp.h "/* **************************************************** *********************************** 函数名称:RCC_Configuration* 说明:配置不同的系统时钟。* 输入:无* 输出:无* 返回:无****************************************************** **************************** */ void RCC_Configuration( void ){ ErrorStatus HSEStartUpStatus;/*设置微控制器系统。初始化嵌入式闪存接口, 初始化 PLL 并更新 SystemFrequency 变量。*/ // SystemInit(); /* RCC 系统复位(用于调试目的)*/ RCC_DeInit(); /*启用 HSE */ RCC_HSEConfig(RCC_HSE_ON); /*等到 HSE 准备好*/ HSEStartUpStatus = RCC_WaitForHSEStartUp(); 如果(HSEStartUpStatus ==成功) { /*启用预取缓冲区*/ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /*闪存 2 等待状态*/ FLASH_SetLatency(FLASH_Latency_2); /* HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* ADCCLK = PCLK2/8 */ RCC_ADCCLKConfig(RCC_PCLK2_Div8); /* PLLCLK = 8MHz * 9 = 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /*使能锁相环*/ RCC_PLLCmd(启用); /*等到 PLL 准备好*/ while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } /*选择 PLL 作为系统时钟源*/ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /*等到 PLL 用作系统时钟源*/ while (RCC_GetSYSCLKSource() != 0x08 ) { } } /*使能 GPIOx 时钟*/ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOG , ENABLE ); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOF , ENABLE ); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE , ENABLE ); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD , ENABLE ); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE ); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE ); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE ); RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO , ENABLE ); /*使能 DMA 时钟*/ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,启用); /*使能 ADC1 和 GPIOC时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE); /*启用 USART1&2 时钟*/ //启用 GPIOA 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); /*启用 USART3 时钟 */ //启用 GPIOB 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE ); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); /*启用 FSMC 时钟*/ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,启用); /*使能 TIM1 时钟源*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,启用);}/* **************************************************** *********************************** 函数名称:GPIO_Configuration* 描述:配置不同的 GPIO 端口。* 输入:无* 输出:无* 返回:无****************************************************** **************************** */ void GPIO_Configuration( void ){ GPIO_InitTypeDef GPIO_InitStructure; /* USART1 使用IO端口配置*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // PA9==USART1_TX 五推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, & GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // PA10==USART1_RX浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化PA10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // PA0端口配置为上拉输入 GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化端口GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化PC端口GPIO_SetBits(GPIOC, GPIO_Pin_13); //关闭所有LED}/* **************************************************** *********************************** 函数名称:NVIC_Configuration* 描述:配置向量表的基本位置。* 输入:无* 输出:无* 返回:无****************************************************** **************************** */ #define VECT_TAB_FLASH void NVIC_Configuration( void ){ NVIC_InitTypeDef NVIC_InitStructure; #if defined (VECT_TAB_RAM) /*将向 量表基址设置在 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0 ); #elif定义(VECT_TAB_FLASH_IAP) NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000 );#else /* VECT_TAB_FLASH */ /*设置向量表基址为 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00000 ); #万一 /*配置 NVIC 抢占优先级位*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /*启用 USART1 中断*/ NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn;; //串口1中断 NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1 ; //子优先级位1 NVIC_InitStructure.NVIC_IRQChannelSubPriority= 1 ; //子优先级位1 NVIC_Init(&NVIC_InitStructure); // ④中断初始化函数 /*启用 USART2 中断*/ NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1 ; NVIC_InitStructure.NVIC_IRQChannelCmd =启用; NVIC_Init( & NVIC_InitStructure); /*启用 USART3 中断*/ NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2 ; NVIC_InitStructure.NVIC_IRQChannelCmd =启用; NVIC_Init( & NVIC_InitStructure); /*启用 EXTI2 中断*/ NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3 ; NVIC_InitStructure.NVIC_IRQChannelCmd =启用; NVIC_Init( & NVIC_InitStructure);}void USART1_Configuration( void ){ USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 115200 ; //波特率设置:115200 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据分散设置:8位 USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位设置:1位 USART_InitStructure.USART_Parity = USART_Parity_No ; //是否奇偶校验:无 USART_Initucture.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制模式设置:没有使能 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收与发送都使能 USART_Init(USART1, &USART_InitStructure); // 初始化USART1 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); // ④开启中断中断!!! USART_Cmd(USART1,启用);// USART1使能 /*以下语句解决第1个字节无法正确发送出去的问题*/ USART_ClearFlag(USART1, USART_FLAG_TC); //清标志} void USART2_Configuration( void ){ USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600 ; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStructure.USART_Mode = USART_Mode_Rx; /*配置 USART2 */ USART_Init(USART2, & USART_InitStructure); /*使能 USART2 接收中断*/ USART_ITConfig(USART2,USART_IT_RXNE,启用); /*启用 USART2 */ USART_Cmd(USART2,启用); /*以下语句解决第1个字节无法正确发送出去的问题*/ USART_ClearFlag(USART2, USART_FLAG_TC); //清标志} void USART3_Configuration( void ){ USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 115200 ; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /*配置 USART3 */ USART_Init(USART3, & USART_InitStructure); /*使能 USART3 接收中断*/ USART_ITConfig(USART3,USART_IT_RXNE,启用); /*启用 USART3 */ USART_Cmd(USART3,启用); /*以下语句解决第1个字节无法正确发送出去的问题*/ USART_ClearFlag(USART3, USART_FLAG_TC); //清标志}void TIM1_Configuration( void ){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //皮变TIMER1胤为轮私欠 TIM_DeInit(TIM1); TIM_TimeBaseStructure.TIM_Period = 0xFFFF ; TIM_TimeBaseStructure.TIM_Prescaler = 0x00 ; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV4; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //时基配置 // TIM_ETRClockMode2Config(TIM1, TIM_ExtTRGPSC_DIV8, TIM_ExtTRGPolarity_NonInverted, 0x0F); TIM_ETRClockMode2Config(TIM1, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted, 0x0F ); TIM_SetCounter(TIM1, 0 ); TIM_Cmd(TIM1,启用);}// BSP初始化函数void bsp_Init( void ){ RCC_Configuration(); //目录配置 GPIO_Configuration(); //端口配置 USART1_Configuration(); //接口配置 // USART2_Configuration(); //接口配置// USART3_Configuration(); //接口配置// FSMC_SRAM_Init(); //总线配置// EXTI_Configuration(); //中断配置// ADC_Configuration(); //采样配// TIM1_Configuration(); //定时器配置 NVIC_Configuration(); //中断配置 Get_ChipID();}6、bsp.h #ifndef __BSP_H__ #define __BSP_H__ #include " includes.h "void RCC_Configuration( void );void GPIO_Configuration( void );无效NVIC_Configuration(无效);void USART1_Configuration( void );void USART2_Configuration( void );void USART3_Configuration( void );void TIM1_Configuration( void );void bsp_Init( void );#万一7、部分stm32f10x_it.c 无效USART1_IRQHandler(无效){ u8 分辨率; if (USART_GetITStatus(USART1,USART_IT_RXNE)) //判断是否有中断! { //串口数据接收函数⑦ res = USART_ReceiveData(USART1); USART_SendData(USART1,res); }} |
|
|
|
只有小组成员才能发言,加入小组>>
2438 浏览 0 评论
9107 浏览 4 评论
36786 浏览 19 评论
5029 浏览 0 评论
24757 浏览 34 评论
1533浏览 2评论
1752浏览 1评论
2199浏览 1评论
1558浏览 0评论
529浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 18:21 , Processed in 1.105631 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号