基于stm32f103最小使用code
来源:互联网 发布:excel表函数数据分类 编辑:程序博客网 时间:2024/06/09 21:45
总共有4个文件,其中led.c和debug.c可以不需要
- main.c
- system.c
- debug.c
- led.c
1. main.c
主要实现系统的初始化,led端口,串口的初始化,此处如果发现1S灯闪烁,打印出"hello world",就说明初步环境好了,可以在这基础上添加自己的代码了。
#include "stm32f10x.h"#include "includes.h"int main(void){system_init();led_init();uart1_init();led_on(0);sys_delay_ms(1000);led_off(0);sys_delay_ms(1000);while(1){sys_delay_ms(2000);led_toggle(0);printf("hello world\r\n");}}#ifdef USE_FULL_ASSERT/** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */void assert_failed(uint8_t* file, uint32_t line){ while (1) { }}#endif/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
2. system.c
此文件实现系统时钟配置,中断向量表配置和systick配置。
#include "system.h"#include "stm32f10x_it.h"ErrorStatus HSEStartUpStatus;//1. clock configvoid rcc_configuration(void){RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(SUCCESS == HSEStartUpStatus){ FLASH_SetLatency(FLASH_Latency_2); FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); RCC_PLLCmd(ENABLE); while(RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY)) { } // HCLK up to 72MHz RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHBÍâÉè RCC_PCLK1Config(RCC_HCLK_Div2); //APB1ÍâÉè RCC_PCLK2Config(RCC_HCLK_Div1); //APB2ÍâÉè RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(0x08 != RCC_GetSYSCLKSource()) { }} }//2.nvic configvoid nvic_configuration(void){#ifdef VECT_TAB_RAM NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);#else NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);#endif}//3. systick config/ 1ms void systick_configuration(void){//clk configurationSysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);SysTick_Config(72000);//1ms arise interrupt}//4. systick ms_delay void sys_delay_ms(uint16_t ms){uint32_t _t = systick_ms_counter+ms;while(systick_ms_counter < _t);}//5. systick s_delayvoid sys_delay_1s(uint16_t s){uint32_t _t = systick_s_counter + s;while(systick_s_counter < _t);}//6. sys_initvoid system_init(void){rcc_configuration();nvic_configuration();systick_configuration();}//7. uncertain_delayvoid delay(uint16_t dly){int i,j;for(i = 0;i<dly;i++)for(j = 0;j<1;j++);}
3. debug.c
该文件用于实现打印串口驱动,只提供打印输出,利用printf函数的重映射,还需要在Keil软件中进行设置,否则打印不出来滴
#include "includes.h"void usart1_gpio_config(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//DBTX PA9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA,&GPIO_InitStructure);//DBRX PA10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);}//2.void usart1_func_config(void){USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);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_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_Init(USART1,&USART_InitStructure);USART_Cmd(USART1,ENABLE);//USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);}//3.void uart1_nvic_config(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}//4.串口初始化,对外的接口.void uart1_init(void){usart1_gpio_config();usart1_func_config();//uart1_nvic_config();}//5.printf函数的重映射实现int fputc(int ch, FILE * f){ //rs232 Debug USART_SendData(USART1, (uint8_t)ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); return ch;}
4. led.c
该文件实现板子上led GPIO口的配置初始化,灯的开,关,闪烁功能。
#include "includes.h"//led config//pe8 pe9void led_init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOE,&GPIO_InitStructure); GPIO_SetBits(GPIOE,GPIO_Pin_8|GPIO_Pin_9); }//void led_on(uint8_t ledid){switch(ledid){case 0:GPIO_ResetBits(GPIOE,GPIO_Pin_8|GPIO_Pin_9);break;case 1:GPIO_ResetBits(GPIOE,GPIO_Pin_8);break;case 2:GPIO_ResetBits(GPIOE,GPIO_Pin_9);break;default:break;}}//void led_off(uint8_t ledid){switch(ledid){case 0:GPIO_SetBits(GPIOE,GPIO_Pin_8|GPIO_Pin_9);break;case 1:GPIO_SetBits(GPIOE,GPIO_Pin_8);break;case 2:GPIO_SetBits(GPIOE,GPIO_Pin_9);break;default:break;}}void led_toggle(uint8_t led_id){switch(led_id){case 0:GPIO_WriteBit(GPIOE,GPIO_Pin_8,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_8))); GPIO_WriteBit(GPIOE,GPIO_Pin_8,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_8))); break;case 1:GPIO_WriteBit(GPIOE,GPIO_Pin_8,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_8)));break;case 2:GPIO_WriteBit(GPIOE,GPIO_Pin_8,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_8)));break;default:break;}}
5. stm32f10x_it.c
感觉也有必要贴出中断服务函数文件,这里面最开始配置了systick的中断服务函数
#include "stm32f10x_it.h"uint32_t systick_ms_counter = 0;uint32_t systick_s_counter = 0;void NMI_Handler(void){}/** * @brief This function handles Hard Fault exception. * @param None * @retval : None */void HardFault_Handler(void){ /* Go to infinite loop when Hard Fault exception occurs */ while (1) { }}/** * @brief This function handles Memory Manage exception. * @param None * @retval : None */void MemManage_Handler(void){ /* Go to infinite loop when Memory Manage exception occurs */ while (1) { }}/** * @brief This function handles Bus Fault exception. * @param None * @retval : None */void BusFault_Handler(void){ /* Go to infinite loop when Bus Fault exception occurs */ while (1) { }}/** * @brief This function handles Usage Fault exception. * @param None * @retval : None */void UsageFault_Handler(void){ /* Go to infinite loop when Usage Fault exception occurs */ while (1) { }}/** * @brief This function handles SVCall exception. * @param None * @retval : None */void SVC_Handler(void){}/** * @brief This function handles Debug Monitor exception. * @param None * @retval : None */void DebugMon_Handler(void){}/** * @brief This function handles PendSVC exception. * @param None * @retval : None */void PendSV_Handler(void){}/** * @brief This function handles SysTick Handler. * @param None * @retval : None */void EXTI1_IRQHandler(){}/* ¹¦ÄÜ£º µ±ÓнÓÊÕÖжÏʱ£¬½«½ÓÊÕµÄ×Ö·û´®´æ·ÅÔÚRxBuff[]ÖÐ µ±Óз¢ËÍÖжÏʱ£¬½«TxBuff[]ÖеÄÊý¾Ý·¢Ë͵½PC¶Ë*/void UART4_IRQHandler(){}void SysTick_Handler(){systick_ms_counter++; //msif(systick_ms_counter%1000==0){systick_s_counter++; //s}}void USART1_IRQHandler(){}/******************************************************************************//* STM32F10x Peripherals Interrupt Handlers *//* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the *//* available peripheral interrupt handler's name please refer to the startup *//* file (startup_stm32f10x_xx.s). *//******************************************************************************//** * @brief This function handles PPP interrupt request. * @param None * @retval : None *//*void PPP_IRQHandler(void){}*//** * @} */ /******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
阅读全文
0 0
- 基于stm32f103最小使用code
- DS18B20 基于STM32F103
- 基于stm32f103的矩阵键盘
- 基于STM32F103的超声波测距
- 基于stm32F103的 A4988驱动
- STM32f103 看门狗使用
- STM32F103看门狗使用记录
- STM32F103
- STM32F103中USART2的使用
- 5.基于STM32F103+OV7670的网络摄像头
- 基于STM32F103的无线数据采集系统
- USB Device应用笔记(基于STM32F103)
- 基于stm32f103的BMP085气压计的检测
- 基于STM32F103关于FreeRTOS 学习笔记
- STM32f103的TFTLCD和FSMC的使用
- STM32f103的触摸屏的设置与使用
- windows10下使用STM32F103的软件集合
- STM32F103 5个串口同时使用
- ARKit-带你走进全新的世界(二:动画与光线处理)
- UnityEngine中Animator相关类的说明
- NLP一周总结(一)
- windows下securecrt链接linux查看日志出现乱码
- day-21-SQL语句-连接池
- 基于stm32f103最小使用code
- 【转载】svn配置文件详析
- gitlab修改默认端口号
- ifndef的使用
- css动画
- Oracle NID工具修改数据库DBID和数据库名称
- ARKit-带你走进全新的世界(三:追踪/距离感应/AR尺子)
- 计算两个数组之间重叠数字对的重叠个数(咋个办呢 zgbn)
- [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序