你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103C8T6相关开发笔记

[复制链接]
STMCU小助手 发布时间:2022-10-27 14:29
1.GPIO 配置

  1.         GPIO_InitTypeDef   GPIO_XXX ;  // 根据自己所需配置的GPIO 命名
  2.         GPIO_XXX.GPIO_Mode   =    GPIO_Mode_Out_PP ;  // 设置GPIO 的模式
  3.         GPIO_XXX.GPIO_Pin    =    GPIO_Pin_11 ;   //所用Gpio 引脚
  4.         GPIO_XXX .GPIO_Speed  =    GPIO_Speed_50MHz ;  //  频率 (根据自己需求配置)
  5.     GPIO_Init( GPIOB, &GPIO_XXX );  // 这句函数配置千万不要忘记了,初始化我们所配置的GPIO
复制代码

2.定时器配置

通过定时器实现GPIOC 13引脚的Led 隔一秒闪烁

  1. #include "stm32f10x.h"

  2. // led函数GPIOC 13
  3. void init_led(void)

  4. {
  5.         //³õʼ»¯½á¹¹Ìå
  6.         GPIO_InitTypeDef  GPIO_INIT;
  7.         //ʱÖÓº¯Êý
  8.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE );

  9.     GPIO_INIT.GPIO_Mode  =  GPIO_Mode_Out_PP ;
  10.         GPIO_INIT.GPIO_Pin   =  GPIO_Pin_13 ;
  11.         GPIO_INIT.GPIO_Speed =  GPIO_Speed_50MHz;
  12.     GPIO_Init( GPIOC, &GPIO_INIT);
  13.         
  14. }

  15. //定时器初始化函数
  16. void Time_Init(void)
  17. {
  18.         TIM_TimeBaseInitTypeDef  Time_Struct;  //定时器结构体
  19.         NVIC_InitTypeDef    NVIC_INIT;  //中断结构体
  20.         
  21.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE) ; //使能定时器时钟

  22.         NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 ); // 使能中断时钟
  23.         
  24.         Time_Struct.TIM_ClockDivision =    TIM_CKD_DIV1  ;  // 一份频
  25.         Time_Struct.TIM_CounterMode   =    TIM_CounterMode_Up ; //向上计数
  26.         Time_Struct.TIM_Period        =    10000 -1;
  27.         Time_Struct.TIM_Prescaler     =    7200 -1;
  28.         
  29.     TIM_TimeBaseInit( TIM2, &Time_Struct);   //初始化结构体
  30.         TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);   //中断
  31.         TIM_Cmd(TIM2 ,ENABLE);
  32.         
  33.         
  34.         //中断结构体配置
  35.     NVIC_INIT.NVIC_IRQChannel        =       TIM2_IRQn ;
  36.         NVIC_INIT.NVIC_IRQChannelCmd     =       ENABLE;
  37.         NVIC_INIT.NVIC_IRQChannelPreemptionPriority  = 1;
  38.         NVIC_INIT.NVIC_IRQChannelSubPriority         = 1;
  39.         NVIC_Init(&NVIC_INIT);

  40. }

  41. //主函数

  42. int main(void)
  43. {
  44.         Time_Init();
  45.         init_led();
  46.    GPIO_SetBits(GPIOC , GPIO_Pin_13); // 开始为高电平
  47.    while(1)
  48.    {
  49.    }
  50. }
  51.         
  52.         
  53.         


  54. void TIM2_IRQHandler (void)
  55. {

  56.         static uint16_t t = 0;
  57.         if(TIM_GetITStatus( TIM2, TIM_IT_Update) != RESET)
  58.         {
  59.                 if(t % 2 == 1)
  60.                 {
  61.                          GPIO_ResetBits(GPIOC,  GPIO_Pin_13);
  62.                 }
  63.                 else
  64.                 {
  65.                   GPIO_SetBits(GPIOC , GPIO_Pin_13);

  66.                         
  67.                 }
  68.         }
  69.          TIM_ClearITPendingBit( TIM2, TIM_IT_Update); //清除标志

  70. }
复制代码

3.串口配置

通过串口向PC机上面发送字符、字符串,并通过PC机上发送指令是单片机实现相应的功能。这里通过接受的字符来控制我们的led灯的开和关

  1. #include "stm32f10x.h"


  2. void init_led(void)

  3. {
  4.         //³õʼ»¯½á¹¹Ìå
  5.         GPIO_InitTypeDef  GPIO_INIT;
  6.         //ʱÖÓº¯Êý
  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE );

  8.     GPIO_INIT.GPIO_Mode  =  GPIO_Mode_Out_PP ;
  9.         GPIO_INIT.GPIO_Pin   =  GPIO_Pin_13 ;
  10.         GPIO_INIT.GPIO_Speed =  GPIO_Speed_50MHz;
  11.     GPIO_Init( GPIOC, &GPIO_INIT);
  12.         
  13. }

  14. void Usart_Init(void)
  15. {
  16.         
  17.         GPIO_InitTypeDef   Gpio_Init;   //gpio结构体
  18.         USART_InitTypeDef  Usart_Init ;//串口结构体
  19.         
  20.         NVIC_InitTypeDef nvic_init;  //´中断结构体
  21.         
  22.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);   //gpio使能时钟        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE);   //¸使能时钟复用
  23.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 ,ENABLE); //使能串口时钟
  24.         
  25.         
  26.         //gpio结构体配置
  27.         // tx a9
  28.         Gpio_Init.GPIO_Mode   =   GPIO_Mode_Out_PP;
  29.         Gpio_Init.GPIO_Pin    =   GPIO_Pin_9   ;
  30.         Gpio_Init.GPIO_Speed  =   GPIO_Speed_50MHz;
  31.         GPIO_Init(GPIOA ,&Gpio_Init);   //³õʼ»¯GPIO
  32.         
  33.         
  34.         //rx a10
  35.         Gpio_Init.GPIO_Mode   =    GPIO_Mode_IN_FLOATING;
  36.         Gpio_Init.GPIO_Pin    =    GPIO_Pin_10 ;
  37.         GPIO_Init(GPIOA ,&Gpio_Init);
  38.         
  39.         
  40.         //串口结构体配置
  41.         Usart_Init.USART_BaudRate     =  115200;  //波特率
  42.         Usart_Init.USART_HardwareFlowControl  = USART_HardwareFlowControl_None  ;
  43.         Usart_Init.USART_Mode        =   USART_Mode_Rx  | USART_Mode_Tx  ;  //收发均可
  44.         Usart_Init.USART_Parity      =   USART_Parity_No ;  //ÓÅÏÈλ
  45.         Usart_Init.USART_StopBits    =   USART_StopBits_1; //停止为
  46.         Usart_Init.USART_WordLength  =   USART_WordLength_8b ;   //字节
  47.         
  48.         USART_Init (USART1 , &Usart_Init);  //初始化函数
  49.         USART_ITConfig( USART1,  USART_IT_RXNE  , ENABLE); //串口中断配置
  50.         USART_Cmd (USART1 ,ENABLE );    //打开串口1
  51.         
  52.         
  53.         
  54.          nvic_init.NVIC_IRQChannel    =   EXTI1_IRQn;
  55.          nvic_init.NVIC_IRQChannelCmd  = ENABLE ;
  56.          nvic_init.NVIC_IRQChannelPreemptionPriority =1;
  57.          nvic_init.NVIC_IRQChannelSubPriority   = 1;

  58.      NVIC_Init(&nvic_init);
  59.                
  60.         
  61. }


  62. //发送字符
  63. void  USARTSendChar(USART_TypeDef* USARTx, uint16_t Data)
  64. {
  65.         
  66.         USART_SendData(USARTx, Data);
  67.         while(USART_GetFlagStatus(USARTx  ,USART_FLAG_TXE ) == RESET);
  68.         
  69. }



  70. //发送字符串
  71. void  UsartSendStr(USART_TypeDef* USARTx, char *str)
  72. {
  73.         uint16_t i=0;
  74.         do
  75.         {
  76.                  USARTSendChar(USARTx ,*(str+i));
  77.                  i++;
  78.         }while(*(str+i)!='\0');
  79.         
  80.         while(USART_GetITStatus( USARTx,USART_FLAG_TC) == RESET) ;  //判断是否接受完毕

  81. }

  82. //复用 printf
  83. int fputc(int ch, FILE *f)
  84. {
  85.         
  86.         USART_SendData(USART1 ,(uint8_t )ch);
  87.         while(USART_GetFlagStatus(USART1  ,USART_FLAG_TXE ) == RESET);
  88.         return (ch);
  89. }

  90. //输入
  91. int fgetc(FILE *f)
  92. {
  93.         while(USART_GetFlagStatus(USART1  ,USART_FLAG_RXNE  ) == RESET);
  94.         
  95.         return (int)(USART_ReceiveData(USART1));
  96. }


  97. int main(void)
  98. {
  99.          init_led(); //初始化led
  100.          Usart_Init();//初始化串口
  101.         // printf("stm32");  //fputc
  102.         // putchar('O');
  103.         while(1)
  104.         {
  105.         }
  106. }


  107. //串口中断1
  108. void USART1_IRQHandler(void)
  109. {
  110.          char temp;
  111.          if(USART_GetITStatus( USART1, USART_IT_RXNE) != RESET)
  112.          {
  113.                         temp = USART_ReceiveData(USART1);
  114.                  
  115.                         if( temp == 'O')
  116.                         {
  117.                                 
  118.                                          GPIO_ResetBits( GPIOC, GPIO_Pin_13);
  119.                                          USARTSENDSTR(USART1 ,"LED IS OPEN");
  120.                         }
  121.                         
  122.                         if( temp == 'C')
  123.                         {


  124.                                         GPIO_SetBits( GPIOC,GPIO_Pin_13);
  125.                                         USARTSENDSTR(USART1 ,"LED IS CLOSE");

  126.             }

  127.                 }
  128.         
  129.         
  130. }
复制代码

4.外部中断配置


通过外部中断来控制我们GPIOC 13引脚Led灯


  1. #include "stm32f10x.h"


  2. void init_led(void)

  3. {
  4.         //³õʼ»¯½á¹¹Ìå
  5.         GPIO_InitTypeDef  GPIO_INIT;
  6.         //ʱÖÓº¯Êý
  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE );

  8.     GPIO_INIT.GPIO_Mode  =  GPIO_Mode_Out_PP ;
  9.         GPIO_INIT.GPIO_Pin   =  GPIO_Pin_13 ;
  10.         GPIO_INIT.GPIO_Speed =  GPIO_Speed_50MHz;
  11.     GPIO_Init( GPIOC, &GPIO_INIT);
  12.         
  13. }

  14. //外部中断
  15. void Exti_Init(void)
  16. {
  17.         //配置gpio
  18.         
  19.         NVIC_InitTypeDef nvic_init;
  20.         EXTI_InitTypeDef exti_init ;
  21.         GPIO_InitTypeDef  shake_init;
  22.         //打开gpio时钟

  23.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA  , ENABLE);
  24.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_AFIO , ENABLE);  //复用GPIOA
  25.         
  26.     GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1); //外中断线配置
  27.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  28.         //震动传感器引脚配置
  29.         shake_init.GPIO_Mode  =   GPIO_Mode_IPD  ;//下拉电平震动
  30.         shake_init.GPIO_Pin   =   GPIO_Pin_1 ;
  31.         shake_init.GPIO_Speed =   GPIO_Speed_10MHz ;
  32.         
  33.         
  34.         //2.配置EXTI外部中断
  35.         exti_init.EXTI_Line      =  EXTI_Line1;
  36.         exti_init.EXTI_LineCmd   =  ENABLE;
  37.         exti_init.EXTI_Mode      =  EXTI_Mode_Interrupt;
  38.         exti_init.EXTI_Trigger   =  EXTI_Trigger_Falling;
  39.         
  40.         EXTI_Init(&exti_init);
  41.         
  42.         
  43.         //3.配置NVIC 中断控制器
  44.         nvic_init.NVIC_IRQChannel      =  EXTI1_IRQn ;
  45.         nvic_init.NVIC_IRQChannelCmd   =        ENABLE;
  46.         nvic_init.NVIC_IRQChannelPreemptionPriority  = 1;
  47.         nvic_init.NVIC_IRQChannelSubPriority = 1;
  48.         
  49.         NVIC_Init(&nvic_init);
  50.         
  51. }


  52. int main()
  53. {
  54.         init_led();
  55.         Exti_Init();
  56.         while(1)
  57.         {

  58.         }
  59. }


  60. void EXTI1_IRQHandler(void)
  61. {
  62.         if(EXTI_GetITStatus( EXTI_Line1 ) != RESET)  //判断是否发送中断
  63.         {
  64.                  GPIO_ResetBits(GPIOA , GPIO_Pin_1);
  65.                  Delay_1ms(1000);
  66.              GPIO_SetBits(GPIOA , GPIO_Pin_1);
  67.         
  68.         }
  69.         
  70.     EXTI_ClearFlag( EXTI_Line1);  //清除中断
  71. }
复制代码

5.定时器控制pwm sg90转动

通过定时器调节占空比来控制sg90的转动(pwm波调节)

  1. #include"stm32f10x.h"


  2. void  delay(uint16_t time)
  3. {
  4.         uint16_t i = 0;
  5.         while(time --)
  6.         {
  7.                 i = 12000 ;
  8.                 while( i--);
  9.         }
  10. }


  11. void init_sg90(void)
  12. {
  13.           GPIO_InitTypeDef  GPIOINIT;
  14.           TIM_TimeBaseInitTypeDef  TIMEINIT;
  15.           TIM_OCInitTypeDef      OCINIT;
  16.         
  17.           RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,  ENABLE);//gpio时钟
  18.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ENABLE);//复用时钟
  19.           RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3,  ENABLE);//定时器时钟
  20.           GPIO_PinRemapConfig( GPIO_PartialRemap_TIM3,  ENABLE);  //部分映射配置


  21.          GPIOINIT.GPIO_Mode   = GPIO_Mode_AF_PP;  
  22.          GPIOINIT.GPIO_Pin    = GPIO_Pin_5 ;
  23.          GPIOINIT.GPIO_Speed  = GPIO_Speed_50MHz;
  24.      GPIO_Init( GPIOB, &GPIOINIT);
  25.         
  26.         
  27.         TIMEINIT.TIM_ClockDivision  = TIM_CKD_DIV1; //设置时钟分割
  28.         TIMEINIT.TIM_CounterMode    = TIM_CounterMode_Up ;//time向上计数模式
  29.         TIMEINIT.TIM_Period         = 200 -1;//设置在下一个更新事件装入活动的自动重载数值
  30.         TIMEINIT.TIM_Prescaler      =  7200 -1; //定时器时钟频率分频值
  31.     TIM_TimeBaseInit( TIM3, &TIMEINIT);  //初始化定时器结构体
  32.         
  33.         
  34.         OCINIT.TIM_OCMode      = TIM_OCMode_PWM1 ; //选择定时器模式一
  35.         OCINIT.TIM_OCPolarity  = TIM_OCPolarity_Low ; //选择有效输出极性
  36.         OCINIT.TIM_OutputState = TIM_OutputState_Enable ;//比较输出使能
  37.     TIM_OC2Init( TIM3, &OCINIT);  //初始化
  38.     TIM_OC2PreloadConfig( TIM3, TIM_OCPreload_Enable);
  39.     TIM_Cmd( TIM3, ENABLE); //使能

  40.         
  41. }


  42. //主函数
  43. int main()
  44. {
  45.         uint16_t pwmval = 155; //设定初值
  46.         init_sg90();
  47.         
  48.         while(1)
  49.         {
  50.                 for( pwmval = 195 ; pwmval >= 175 ;pwmval -= 5)
  51.                 {
  52.                  TIM_SetCompare2( TIM3, pwmval);
  53.                  delay(500);
  54.                 }
  55.         }


  56. }
复制代码

6.系统定时器SysTick

通过使能系统定时器更加精确的进行定时功能,闪烁Led灯

  1. void init_led(void)

  2. {
  3.         //³õʼ»¯½á¹¹Ìå
  4.         GPIO_InitTypeDef  GPIO_INIT;
  5.         //ʱÖÓº¯Êý
  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE );

  7.     GPIO_INIT.GPIO_Mode  =  GPIO_Mode_Out_PP ;
  8.         GPIO_INIT.GPIO_Pin   =  GPIO_Pin_13 ;
  9.         GPIO_INIT.GPIO_Speed =  GPIO_Speed_50MHz;
  10.     GPIO_Init( GPIOC, &GPIO_INIT);
  11.         
  12. }

  13. //1us
  14. void  SysTick_1us(uint32_t us)
  15. {
  16.         uint32_t i ;
  17.         SysTick_Config(72);
  18.         for( i = 0; i <  us ; i++)
  19.                 {
  20.                         while(! (SysTick->CTRL) &( 1 <<16 ));
  21.                 }                        
  22.         SysTick ->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  23. }



  24. //1ms
  25. void SysTick_1ms(uint32_t ms)
  26. {
  27.         
  28.         uint32_t i ;
  29.         SysTick_Config(72000);
  30.         for( i = 0; i <  ms ; i++)
  31.                 {
  32.                         while(! (SysTick->CTRL) &( 1 <<16 ));
  33.                 }                        
  34.         SysTick ->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  35.         
  36. }



  37. int main()
  38. {
  39.         
  40.                 init_led();
  41.               GPIO_SetBits(GPIOC,  GPIO_Pin_13);
  42.                 while(1)
  43.                 {
  44.                         GPIO_ResetBits( GPIOC, GPIO_Pin_13);
  45.                         SysTick_1ms(500);
  46.                         GPIO_SetBits(GPIOC,  GPIO_Pin_13);
  47.                         SysTick_1ms(500);
  48.             }
  49. }
复制代码

————————————————
版权声明:@slow-walker

收藏 评论0 发布时间:2022-10-27 14:29

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版