Главная » Статьи » Уроки по программированию stm32fxxx » Уроки по программированию stm32f1xx

Урок 4: SysTick
В примере для GPIO задержка задавалась в тактах и сложно пересчитать полученное значение во время. В этом примере мы напишем функцию delay на SysTick.
В функции InitAll()прописываем строку SysTick_Config(SystemCoreClock /1000);//1ms Делителем можно изменять частоту тактирования таймера. В данном случае таймер будет срабатывать каждую 1 мс.

Функцию Delay() перепишем следующим образом:

void Delay( unsigned int Val)
{
SysTickDelay = Val;
while (SysTickDelay != 0) {};
}

Где SysTickDelay – глобальная переменная.

Теперь осталось только в функцию прерывания от SysTick прописать код:

void SysTick_Handler(void)
{
if (SysTickDelay != 0)
{
SysTickDelay--;
}
}

Работать это будет так: Когда вы пишите Delay(x);
Функция устанавливает SysTickDelay отличный от 0 и каждую 1 мс значение уменьшается на 1. Сама функция проверяет эту переменную на равенство 0. Через х мс переменная станет равна 0 и функция delay() завершится.

Вся программа выглядит так:

  1. #include "main.h"  
  2. #include "Interupts.c"  
  3.   
  4. //------------------------------------------------------------------------  
  5. int main(void)  
  6. {  
  7.    InitAll();  
  8.    while(1)  
  9.    {  
  10.       GPIO_SetBits(GPIOB, GPIO_Pin_0);  
  11.       GPIO_SetBits(GPIOB, GPIO_Pin_1);  
  12.       Delay(500);  
  13.   
  14.       GPIO_ResetBits(GPIOB, GPIO_Pin_0);  
  15.       GPIO_ResetBits(GPIOB, GPIO_Pin_1);  
  16.       Delay(500);  
  17.    }  
  18. }  
  19.   
  20. //------------------------------------------------------------------------  
  21. void InitAll( void)  
  22. {  
  23.    GPIO_InitTypeDef GPIO_ini;  
  24.   
  25.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  
  26.   
  27.    GPIO_ini.GPIO_Pin = GPIO_Pin_0;  
  28.    GPIO_ini.GPIO_Speed = GPIO_Speed_10MHz;  
  29.    GPIO_ini.GPIO_Mode = GPIO_Mode_Out_PP;  
  30.   
  31.    GPIO_Init(GPIOB, &GPIO_ini);  
  32.   
  33.    GPIO_ini.GPIO_Pin = GPIO_Pin_1;  
  34.    GPIO_ini.GPIO_Speed = GPIO_Speed_10MHz;  
  35.    GPIO_ini.GPIO_Mode = GPIO_Mode_Out_PP;  
  36.   
  37.    GPIO_Init(GPIOB, &GPIO_ini);  
  38.   
  39.    SysTick_Config(SystemCoreClock /1000);//1ms  
  40.   
  41.    return;  
  42. }  
  43.   
  44. //------------------------------------------------------------------------  
  45. void Delay( unsigned int Val)  
  46. {  
  47.    SysTickDelay = Val;  
  48.    while (SysTickDelay != 0) {};  
  49. }  
  50.   
  51. //------------------------------------------------------------------------  
  52. void SysTick_Handler(void)  
  53. {  
  54.    if (SysTickDelay != 0)  
  55.    {  
  56.       SysTickDelay--;  
  57.    }  
  58. }  
  59.   
  60. //------------------------------------------------------------------------  
  61. //------------------------------------------------------------------------  
  62. //main.h.  
  63. #ifndef __MAIN_H  
  64. #define __MAIN_H  
  65.   
  66. #include "stm32f10x.h"  
  67. //#include "Interupts.c"  
  68.   
  69. int SysTickDelay;  
  70.   
  71. void InitAll( void);  
  72. void Delay( unsigned int Val);  
  73. void SysTick_Handler(void);  
  74. #endif /* __MAIN_H */  

Использование библиотеки SysTick

1) Создаём группу SysTick
2) Добавляем файлы stm32f10x_systick.c и systick.c
3) В main.c прописываем #include "systick.h"
4) В target1 - > Optionc -> C/C++ -> Include paths прописываем .\Libs\SysTick.
5) В инициализации добавляем строку delay_init(); 6) Теперь все delay можно заменить на delay_ms(uint16_t time), где time – время в миллисекундах. Или на delay_us(u32 time), где time – время в микросекундах.

Библиотеки можно скачать с раздела Каталог файлов
Категория: Уроки по программированию stm32f1xx | Добавил: Korvin (10.02.2012)
Просмотров: 12105 | Комментарии: 11 | Рейтинг: 5.0/1
Всего комментариев: 11
10 Pavlo  
0
урокі супер! все чітко і ясно без лишнього текста!!!

11 Korvin  
0
Спасибі.

6 _SvC_  
0
Уроки помогают, хотелось бы побольше уроков для работы с разной периферией (uart, spi и другое)

7 Korvin  
0
Про USART есть. Готовятся про I2C и таймеры, но пока нет времени написать.

8 _SvC_  
0
usart хотелось бы без использования stdperiph. Просто после аврок как то дико смотреть на абстрактные структуры, методы и функции

9 Korvin  
0
Без std periph можно, но там проблема с пересчётом скорости работы USART. У меня ручками не заработало. Явно где-то в расчётах ошибся.

3 LVII  
0
Жаль что скачать уже ничего нельзя?!!

4 Korvin  
0
Спасибо, что указали на ошибку. Сейчас исправлю.

5 Korvin  
0
Исправлено. Дело было в том, что я обновил библиотеки StdPeriph до 3.5.0 и видно перенёс с папку stm32. В итоге ссылка была битая. Но все файлы спокойно лежат на этом сайте в разделе "Каталог файлов", откуда вы спокойно можете их скачать.

1 flaunder  
0
неожиданно как то уж очень найти такое в подобном месте

2 Korvin  
0
biggrin
Всё просто. Я решил выкладывать сюда, чтоб не поддерживать 2 сайта. У меня уже 1 раз удалили сайт за непосещаемость, вот теперь пишу тут. Надеюсь есть те, кому помогают эти уроки.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]