اموزش راه اندازی LED (مثال دوم)

 

هدف از این مثال این است که شما با رجیستر هایی که برای ست و ریست کردن یک پین مورد استفاده قرار می،­گیرد آشنا شوید. در این مثال ساده حداکثر سرعت میکرو را نشان داده شده است.

سخت افزار

برای تست این برنامه می­توانید از چهارLED  که بر روی  برد آموزشی قرار دارد، استفاده کنید. شماره­ی پین­هایی که می­توانید استفاده کنید، در تصویر زیر نشان داده شده است.

 

 

 

 

 

 

 

 

 

 

 

 

آشنایی و کار با برنامه

ابتدا برنامه را با نرم افزار Keil باز کنید.

 

 

 

 

 

 

 

 

 

تغذیه 5 ولت را به برد آموزشی متصل کنید و بعد از اینکه پروگرامر ST-LINK را به برد متصل نمودید؛ برنامه را با استفاده از دکمه ­ی Download    پروگرم نمائید.

 

خروجی  پین های PC2   وPC3  با استفاده از اسیلوسکوپ اندازه گیری شده­ اند و در شکل زیر نشان داده می­شود.

توضیحات مربوط به برنامه

ابتدا استراکچری، مربوط به تنظیمات اولیه پین­های ورودی و خروجی تعریف شده است.

/* Includes ---------------------------------------*/
#include "stm32f10x.h"
 
GPIO_InitTypeDef GPIO_InitStructure;

سپس در تابع main  برنامه تنظیمات مربوط به کلاک GPIO  وخود GPIO انجام شده است.

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f10x_xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f10x.c file
     */
       
  /* GPIOC Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
 
  /* Configure PC2 and PC3 in output pushpull mode */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

در حلقه ­ی while   پین­های C2  و C3   پشت سرهم ست و ریست می­شوند.

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
intmain(void)
{
  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f10x_xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f10x.c file
     */
       
  /* GPIOC Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

  /* Configure PC2 and PC3 in output pushpull mode */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* To achieve GPIO toggling maximum frequency, the following  sequence is mandatory.
     You can monitor PC.2 or PC.3 on the scope to measure the output signal.
     If you need to fine tune this frequency, you can add more GPIO set/reset
     cycles to minimize more the infinite loop timing.
     This code needs to be compiled with high speed optimization option.  */
  while(1)
  {
    /* Set PC2 and PC3 */
    GPIOC->BSRR = 0x0000000C;
    /* Reset PC2 and PC3 */
    GPIOC->BRR  = 0x0000000C;

   /* Set PC2 and PC3 */
   GPIOC->BSRR = 0x0000000C;
   /* Reset PC2 and PC3 */
   GPIOC->BRR  = 0x0000000C;

   /* Set PC2 and PC3 */
   GPIOC->BSRR = 0x0000000C;
   /* Reset PC2 and PC3 */
   GPIOC->BRR  = 0x0000000C;

   /* Set PC2 and PC3 */
   GPIOC->BSRR = 0x0000000C;
   /* Reset PC2 and PC3 */
   GPIOC->BRR  = 0x0000000C;

   /* Set PC2 and PC3 */
   GPIOC->BSRR = 0x0000000C;
   /* Reset PC2 and PC3 */
   GPIOC->BRR  = 0x0000000C;

   /* Set PC2 and PC3 */
   GPIOC->BSRR = 0x0000000C;
   /* Reset PC2 and PC3 */
   GPIOC->BRR  = 0x0000000C;

   /* Set PC2 and PC3 */
   GPIOC->BSRR = 0x0000000C;
   /* Reset PC2 and PC3 */
   GPIOC->BRR  = 0x0000000C;

   /* Set PC2 and PC3 */
   GPIOC->BSRR = 0x0000000C;
   /* Reset PC2 and PC3 */
   GPIOC->BRR  = 0x0000000C;

   /* Set PC2 and PC3 */
   GPIOC->BSRR = 0x0000000C;
   /* Reset PC2 and PC3 */
   GPIOC->BRR  = 0x0000000C;

   /* Set PC2 and PC3 */
   GPIOC->BSRR = 0x0000000C;
   /* Reset PC2 and PC3 */
   GPIOC->BRR  = 0x0000000C;
  }


    
}

{ نکته ی برنامه نویسی }

همانطور که در تصویر بالا مشاهده مینمائید، رجیسترهای BRR   و BSRR  با  x0000000Cمقداردهی شده اند.

همانطور که می­دانید رجیسترها در پردازنده­های ARM   همگی 32 بیتی هستند. در اینجا ما می خواهیم LED های 2 و 3 را روشن و خاموش کنیم. پس بیت­های 2و3  رجیستر های BSRR  و BRR  باید 1 شوند و بقیه بیت­ها باید 0 باشند.

 

 

دانلود مثال ها و pdf این مقاله



 

Tags: , , ,