Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
cerera_a1
0 / 0 / 0
Регистрация: 17.09.2018
Сообщений: 6
1

Stm8 переключение с hsi на lsi

26.03.2019, 21:27. Просмотров 348. Ответов 2
Метки stm8 (Все метки)

Здравствуйте,
Пытаюсь переключить тактирование мк с hsi(16 мгц) на lsi. Делаю всё по reference manual, но безуспешно.
мк - stm8s103f2p6, компилятор - sdcc.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <stdint.h>
 
#define GPIOD_BaseAddress       0x00500F
#define GPIOD ((GPIO_TypeDef *) GPIOD_BaseAddress)
 
#define GPIOB_BaseAddress       0x005005
#define GPIOB ((GPIO_TypeDef *) GPIOB_BaseAddress)
 
#define CLK_BaseAddress         0x0050C0
#define CLK   ((CLK_TypeDef *)  CLK_BaseAddress)
 
volatile uint32_t time = 50000; // old 50000
 
typedef struct GPIO_struct
{
   volatile uint8_t ODR; /*!< Output Data Register     */
   volatile uint8_t IDR; /*!< Input Data Register      */
   volatile uint8_t DDR; /*!< Data Direction Register  */
   volatile uint8_t CR1; /*!< Configuration Register 1 */
   volatile uint8_t CR2; /*!< Configuration Register 2 */
}
GPIO_TypeDef;
 
typedef struct CLK_struct
{
   volatile  uint8_t  CLK_ICKR;     /* Internal clock control register         */
   volatile  uint8_t  CLK_ECKR;     /* External clock control register         */
   volatile  uint8_t  RESERVED;
   volatile  uint8_t  CLK_CMSR;     /* Clock master status register            */
   volatile  uint8_t  CLK_SWR;      /* Clock master switch register            */
   volatile  uint8_t  CLK_SWCR;     /* Clock switch control register           */
   volatile  uint8_t  CLK_CKDIVR;   /* Clock divider register                  */
   volatile  uint8_t  CLK_PCKENR1;  /* Peripheral clock gating register 1      */
   volatile  uint8_t  CLK_CSSR;     /* Clock security system register          */
   volatile  uint8_t  CLK_CCOR;     /* Configurable clock control register     */
   volatile uint16_t  CLK_PCKENR2;  /* Peripheral clock gating register 2      */
   volatile  uint8_t  CLK_HSITRIMR; /* HSI clock calibration trimming register */
   volatile  uint8_t  CLK_SWIMCCR;  /* SWIM clock control register             */
}
CLK_TypeDef;
 
 
void delay(uint32_t time)
{
    while(time--);
}
 
void init_gpio(void)
{
    GPIOB->DDR |= (1 << 5);    /* set direction as output */
    //GPIOB->ODR |= (1 << 5);    /* set output 1            */
    GPIOB->CR1 |= (1 << 5);    /* init as push-pull       */
    
}
 
void init_clk_hsi(void) /* set clk to 16 MHz */
{
    CLK->CLK_CKDIVR &= ~((1 << 4) | (1 << 3));     /* set HSIDIV bits to 0 */
    CLK->CLK_CKDIVR &= ~((1 << 2) | (1 << 1) | 1); /* set CPUDIV bits to 0 */
 
    while(!(CLK->CLK_ICKR & (1 << 1))) // wait for HSIRDY (High speed internal oscillator ready)
    {
        
    }
}
 
void init_clk_lsi(void)
{
    CLK->CLK_ICKR |= (1 << 3);
    CLK->CLK_SWR = 0xD2;
 
    while((CLK->CLK_SWCR & (1 << 3)) == 0) // wait for Target clock source ready
    {
 
    }
 
    CLK->CLK_SWCR |= (1 << 1); // Enable clock switch execution
 
    while((CLK->CLK_ICKR & (1 << 4)) == 0)
    {
 
    }
 
    CLK->CLK_ICKR &= ~(1); // switch off HSI
}
 
void main(void)
{
    init_gpio();
    init_clk_hsi();
    init_clk_lsi();
 
    while(1)
    {
        GPIOB->ODR |= (1 << 5);
        delay(time);
        
        GPIOB->ODR &= ~(1 << 5);
        delay(time);
    }
}
Методом научного тыка определил, что проблема в

C
1
2
3
4
    while((CLK->CLK_SWCR & (1 << 3)) == 0) // wait for Target clock source ready
    {
 
    }
В этом цикле поток остается. Не могу понять, что я сделал не так.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2019, 21:27
Ответы с готовыми решениями:

Переключить тактовый генератор с HSI на LSI (STM8l-Discovery)
Здравствуйте, в качестве обучения захотелось переключить тактовый генератор с HSI на LSI. Но...

кто сделает экспорт SDCC STM8 -> IAR STM8 ?
а то труды пропадут... https://github.com/eddyem/STM8_samples

stm32f100c4 на 24мгц от hsi ?
Начал освоение аЦких камней. Возник вопрос: Как запустить stm32f100c4 на 24мгц от hsi используя...

stm32 hsi/hse
103C8. Запускаю usart1 на hsi. Вывожу сообщение из кольцевого буфера по прерыванию. Работает....

2
Voland_
1754 / 1086 / 108
Регистрация: 04.01.2010
Сообщений: 3,776
26.03.2019, 21:48 2
В подобных местах я бы *настоятельно* бы вам рекомендовал использовать примеры производителя. Даже читая даташиты - вам не гарантирована работа периферии согласно документации. Мало того - далеко не факт, что то что завелось и поехало сегодня, поедет завтра, в других условиях и с другим кварцем, например. По сему - вы можете взять код примеров, и оптимизировать его, если хотите. Но вдумчиво, и не меняя ни последовательность, ни выкидывая ничего из фаз управления флагами и клоками.
0
cerera_a1
0 / 0 / 0
Регистрация: 17.09.2018
Сообщений: 6
28.03.2019, 17:09  [ТС] 3
Переделал пример производителя. Разница в том, что теперь используется автоматический режим, а не ручной. Результат точно такой же(частота не меняется). Попробую сменить компилятор.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <stdint.h>
 
#define GPIOB_BaseAddress       0x005005
#define GPIOB ((GPIO_TypeDef *) GPIOB_BaseAddress)
 
#define GPIOD_BaseAddress       0x00500F
#define GPIOD ((GPIO_TypeDef *) GPIOD_BaseAddress)
 
#define CLK_BaseAddress         0x0050C0
#define CLK   ((CLK_TypeDef *)  CLK_BaseAddress)
 
#define CLK_SWCR_SWEN           (1 << 1)
#define CLK_SWCR_SWIEN          (1 << 2)
#define CLK_SWCR_SWIF           (1 << 3)
 
volatile  uint8_t flag_ready = 0;
 
volatile uint32_t time = 50000;
 
typedef struct GPIO_struct
{
   volatile uint8_t ODR; /*!< Output Data Register     */
   volatile uint8_t IDR; /*!< Input Data Register      */
   volatile uint8_t DDR; /*!< Data Direction Register  */
   volatile uint8_t CR1; /*!< Configuration Register 1 */
   volatile uint8_t CR2; /*!< Configuration Register 2 */
}
GPIO_TypeDef;
 
typedef struct CLK_struct
{
   volatile  uint8_t      ICKR;  /* Internal clock control register         */
   volatile  uint8_t      ECKR;  /* External clock control register         */
   volatile  uint8_t  RESERVED;
   volatile  uint8_t      CMSR;  /* Clock master status register            */
   volatile  uint8_t       SWR;  /* Clock master switch register            */
   volatile  uint8_t      SWCR;  /* Clock switch control register           */
   volatile  uint8_t    CKDIVR;  /* Clock divider register                  */
   volatile  uint8_t   PCKENR1;  /* Peripheral clock gating register 1      */
   volatile  uint8_t      CSSR;  /* Clock security system register          */
   volatile  uint8_t      CCOR;  /* Configurable clock control register     */
   volatile uint16_t   PCKENR2;  /* Peripheral clock gating register 2      */
   volatile  uint8_t  HSITRIMR;  /* HSI clock calibration trimming register */
   volatile  uint8_t   SWIMCCR;  /* SWIM clock control register             */
}
CLK_TypeDef;
 
 
void delay(uint32_t time)
{
    while(time--);
}
 
void init_gpio(void)
{
    GPIOB->DDR |= (1 << 5);    /* set direction as output */
    //GPIOB->ODR |= (1 << 5);    /* set output 1            */
    GPIOB->CR1 |= (1 << 5);    /* init as push-pull       */
}
 
void init_clk_hsi(void) /* set clk to 16 MHz */
{
    CLK->CKDIVR &= ~((1 << 4) | (1 << 3));     /* set HSIDIV bits to 0 */
    CLK->CKDIVR &= ~((1 << 2) | (1 << 1) | 1); /* set CPUDIV bits to 0 */
 
    while(!(CLK->ICKR & (1 << 1))) // wait for HSIRDY (High speed internal oscillator ready)
    {
        __asm__("nop");   // Waiting for HSIRDY (High speed internal oscillator ready) 
                          // bit is set by hardware
    }
}
 
void init_clk_lsi(void)
{
    // CLK->ICKR |= (1 << 3);
    // CLK->SWR = 0xD2;
 
    // while((CLK->SWCR & (1 << 3)) == 0) // wait for Target clock source ready
    // {
 
    // }
 
    // CLK->SWCR |= (1 << 1); // Enable clock switch execution
 
    // while((CLK->ICKR & (1 << 4)) == 0)
    // {
 
    // }
 
    // CLK->ICKR &= ~(1); // switch off HSI
 
    CLK->ICKR |= (1 << 3);                          // LSIEN: Low speed internal RC oscillator enable
 
    CLK->SWCR &= ~CLK_SWCR_SWIF;                    // clear SWIF flag
    CLK->SWCR |= CLK_SWCR_SWEN | CLK_SWCR_SWIEN;    // enable clock control interrupt
    CLK->SWR   = 0xD2;                              // initiate automatic switch mode (only if LSI_EN option bit is set)
}
 
void ClockControlerInterrupt (void) __interrupt(2) 
{
    CLK->SWCR &= ~CLK_SWCR_SWIF;                    // clear SWIF flag
    flag_ready = 1;
}
 
void main(void)
{
    init_gpio();
    init_clk_hsi();
 
    __asm__("rim"); // enable interrupts
 
    init_clk_lsi();
 
    while(1)
    {
        GPIOB->ODR |= (1 << 5);
        delay(time);
        
        GPIOB->ODR &= ~(1 << 5);
        delay(time);
 
        // if (flag_ready)
        //     GPIOB->ODR &= ~(1 << 5);
    }
}
Обнаружено, что прерывание не сработало. Хотя изменения примера минимальные.
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2019, 17:09

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Тактирование от PLL по HSI
Тактирование от HSI, HSE, PLL\HSE проходит успешно, а от PLL\HSI не работает. Судя по асмеблерскому...

SYSCLK = HSE -> PLL = HSI помогите с тактированием при CSS
Добрый день. Подскажите пожалуйста, возможно ли решить следующую задачу, если да то как? Есть...

STM32F100 - при включении PLL частота HSI падает до 7,48 мгц
Такая проблема: при включении PLL частота HSI падает до 7,48 мгц. Чатоту контролирую на выводе PA8...

LSI as master clock source
Зависает на строке while(CLK_CMSR != 0xD2); CLK_ICKR_bit.LSIEN = 1; // Enable LSI...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.