LINUX.ORG.RU

Tim1

 ,


0

1

stm32f103c8 здрасьте здрасьте люди добрые) поправьте пожалуйста код, чтобы работало. Смысл такой, что надо сделать для понимание мигание светодиода с итревалом 3 сек с помощью таймера TIM1. пожалуйста обратите внимание на теги. в них нет СИ. не пишите пожалуйста примеры, которые не будут работать без библиотек, или которые вобще не будут работать.

.cpu cortex-m3
.thumb
.section .text
TIM1_PSC_zero_bit:  .word 0x42258500
TIM_CR1_CEN:        .word 0x42258000
TIM_CR1:            .word 0x40012c00
TIM_BDTR_MOE:       .word 0x422588BC
TIM1_PSC:           .word 0x40012c28

RCC_APB2ENR_TIM1EN: .word 0x4242032C//адрес рассчитан по формуле(смещение*32)+(4*Numbit)+0x42000000
//так как таймер будет работать у меня от частоты шины, то подключаю его.

.global _start
_start:
mov r5, #1
ldr r0, =RCC_APB2ENR_TIM1EN
str r5, [r0]

//TIM1_CNT оставлю по умолчанию.
mov r1, #1
ldr r0, =TIM_CR1_CEN
str r1, [x0]// разрешает счет.

//настраиваю счетчик на дикремент. 
ldr r0, =TIM_CR1_CEN
mov r1, #1
str r1, [r0, #16]// поместил единицу в бит DIR
mov r1, #0
str r1, [r0, #20]  поместил ноль в бит CMS
str r1, [r0, #24] поместил ноль в бит СМS
//помещаю 7999 в TIM_PSC
mov r1, #1
mov r2, #0
ldr r0, =TIM1_PSC_zero_bit
str r1, [r0]
str r1, [r0, #4]
str r1, [r0, #8]
str r1, [r0, #12]
str r1, [r0, #16]
str r1, [r0, #20]
str r2, [r0, #24]
str r2, [r0, #28]
str r1, [r0, #32]
str r1, [r0, #36]
str r1, [r0, #40]
str r1, [r0, #44]
str r1, [r0, #48]
// в TIM_PSC лежит #1111100111111
up:


bl up
чтобы светодиод мигал что нужно сделать? как связать ногу PC13 c TIM1?

Ответ на: комментарий от COKPOWEHEU

Например, я сейчас пилю программатор для RISCV, который выглядит как переходник USB в 2*UART + Audio + HID

для такого спеца как вы ничего не стоит внести пару штрихов гениальности в код что накидаю я сейчас из взятого за основу примера. цель-включить PWM. ну так что? найдете время?

Assembler
() автор топика
Ответ на: комментарий от COKPOWEHEU

Потому что поиск недокументированных возможностей лично меня сейчас не интересует.

Да, на всякий случай. Не путайте недокументированные возможности и плохо описанные в документации.

Например, у stm32f103c8t6 в документации прописано 64 кБ флеша, хотя в реальности частенько 128 кБ. Прописана частота до 72 МГц, хотя в реальности можно разогнать раза в полтора. Вот это недокументированные возможности. Их можно искать из спортивного интереса, но полагаться при разработке серьезного прибора нельзя. Потому что в том конкретном экземпляре, что достанется Самому Важному Заказчику окажется именно контроллер с 64 кБ и скоростью 72 МГц. Но и даже в остальных при выходе за режим запросто могут ухудшиться другие параметры, как точность АЦП или потребление.

COKPOWEHEU
()
Ответ на: комментарий от Assembler

для такого спеца как вы ничего не стоит внести пару штрихов гениальности в код что накидаю я сейчас из взятого за основу примера. цель-включить PWM. ну так что? найдете время?

Повторяю: мне это не интересно. Что-то делать только потому что рандомный форумчанин пытается взять «на слабо» я не собираюсь.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

пытается взять «на слабо» я не собираюсь.

да о чем вы говорите? я просто прошу подправить код, который попытаюсь собрать. Вам с вашим опытом, это пара пустяков и одна минутка. а то что я вспомнил ваши слова, так это я процитировал великих. цитаты же не запрещены?

Assembler
() автор топика
Ответ на: комментарий от COKPOWEHEU

Если вы так и будете требовать от других что-то за вас сделать, как вы сами чему-то научитесь?

Начальником станет же

anonymous
()
Ответ на: комментарий от COKPOWEHEU

Нет, в китайском блинке не используется таймер! Это слишком сложно для них! Там тупо в суперлупе циклы с nop'ами в качестве задержки.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Емнип, у китайцев там 330 Ом, т.е. 10мА.

Откуда 10 мА?

(3.3 - 1.8) / 330 = 4.5 мА

Нога не сгорает только чудом!

Это же КМОП, при перегрузке переходит в режим ограничения тока. Подобным способом их пожечь непросто.

Нет, в китайском блинке не используется таймер!

Эти два персонажа вроде нашли где-то код миганием PC13 через прерывания Timer1.

Правда, что их заставляет подозревать что на PC13 может быть заведен таймер я не знаю. В даташите намеков кажется нет.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

Ну, я уже немало ног МК (причем, зачастую все остальные как ни в чем не бывало поработали) пожег, закоротив случайно, когда они в пуш-пул были.

Один раз отгорело верхнее плечо, а нижнее продолжало работать, напаял подтяжку и все ОК.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Емнип, у китайцев там 330 Ом, т.е. 10мА. Нога не сгорает только чудом!

Умный Эдик оказался глупее глупых китайцев, что не смог нормально посчитать ток через СД и резистор (510 ом, кстати). Лишь бы поругать кого.

anonymous
()
Ответ на: комментарий от COKPOWEHEU

я не могу проверить код. Возможно он и не работает. пытаюсь вольтметром, но что-то там показания столь малы, что сложно. надо купить светодиод. посоветуйте какой, чтобы проверить. и какое сопротивление нужно. ну вобщем какой светодиод просить в магазине радиоэлектронике, чтобы можно было подцепить к Китайской stm32f103 на ногу B8 и землю.

Assembler
() автор топика
Ответ на: комментарий от anonymous

вы опять тут пытаетесь всех настроить друг против друга? можно вас пропросить перестать. Я просто хочу проверить код, вы же хотите всем все испортить. Похоже это COKPOWEHEU так балуется. забавы гением странны что и говорить.

Assembler
() автор топика
Ответ на: комментарий от Assembler

посоветуйте какой, чтобы проверить

попроси у эдика ал102 (похоже, что он ими пользуется, раз они у него от 3 миллиампер не горят). калькулятор для перевода микрокандел в люмены: https://www.rapidtables.com/calc/light/candela-to-lumen-calculator.html

для ал102г, тока в 10 миллиампер и угле раскрытия в 80°, у меня получилось около 0.3 миллилюмен xd

для справки: современные примерно в 1000 раз ярче

anonymous
()
Ответ на: комментарий от Assembler

я не могу проверить код. Возможно он и не работает. пытаюсь вольтметром

Что пытаетесь проверить вольтметром? Если ШИМ, то цифровым это делать бесполезно, нужно хотя бы стрелочным.

надо купить светодиод. посоветуйте какой, чтобы проверить. и какое сопротивление нужно.

Да в общем-то любой индикаторный. Можно мелкий SMD (если сумеете его запаять), можно выводной 5 мм или 3 мм. Цвет тоже какой больше нравится. Разве что сверхъяркие пока не стоит. Да и смысла нет: вам ведь нужно отличить включенное состояние от выключенного, а не ночник городить.

Резистор можно посчитать по закону Ома если известны характеристики диода. Но это редкость, поэтому проще экспериментально, будет где-то от 2 кОм до 100 Ом. Вот тут теория действительно плохо работает, поскольку угадать характеристики светодиода почти невозможно, им для включения нужен ОЧЕНЬ разный ток.

Еще порекомендую купить монтажные провода гнездо-гнездо. Если есть макетная плата, можно еще гнездо-штырь и штырь-штырь. Но и три провода гнездо-гнездо позволят подключить диод без пайки, просто вставляя ножки в гнезда.

COKPOWEHEU
()
Ответ на: комментарий от Assembler

вы же хотите всем все испортить. Похоже это COKPOWEHEU так балуется. забавы гением странны что и говорить.

Не угадали. Я к этому стукнутому анонимуму отношения не имею. И вам рекомендую не обращать внимания

COKPOWEHEU
()
Ответ на: комментарий от Eddy_Em

Один раз отгорело верхнее плечо, а нижнее продолжало работать

Эдик, я буду любить тебя и с одним плечом …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

если нельзя включить ШИМ на PC13, то вот пытаюсь это сделать на A8


.syntax unified
.cpu cortex-m3
.thumb

RCC_APB2ENR = 0x40021018

RCC_APB2ENR_I = (1 << 2)
RCC_APB2ENR_T = (1 << 11)



GPIOA_CRH = 0x40010804
TIM1_CR1 = 0x40012c00
TIM_CR1_URS = (1 << 2)
TIM_CR1_CEN = (1 << 0)

TIM1_PSC = 0x40012c28
TIM1_ARR = 0x40012c2c

TIM1_DIER = 0x40012c0c
TIM_DIER_UIE = (1 << 0)

TIM1_EGR = 0x40012c14
TIM_EGR_UG = (1 << 0)

NVIC_ISER0 = 0xe000e100
TIM1_UP = (1 << 25)

TIM1_SR = 0x40012c10
TIM_SR_UIF = (1 << 0)


GPIOA_ODR = 0x4001080C

.text
	.word   0x20005000
	.word   _start 
	

.global _start
_start:
	

	ldr    r0, =TIM1_CR1
	ldr    r1, =TIM_CR1_URS
	str    r1, [r0]

	ldr    r0, =TIM1_PSC
	ldr    r1, =10000
	str    r1, [r0]

	ldr    r0, =TIM1_ARR
	ldr    r1, =3000
	str    r1, [r0]

	
	ldr    r0, =TIM1_EGR
	ldr    r1, =TIM_EGR_UG
	str    r1, [r0]

//TIM1 =0x40012C00
//enable PWM
TIM1_CCMR1= 0x40012C18
TIM1_ССER =0x40012C20
TIM1_CR1 =0x40012c00
TIM1_BDTR =0x40012C44
Tim1_CCR1 =0x40012C34


TIM1->CC_MR1|=6<<4;  		 
TIM1->CC_MR1|=1<<3; 		 
TIM1->CC_ER|=1<<0;   		   
TIM1->BDTR|=1<<15;      
			
TIM1->CR1=0x0080;   	
TIM1->CR1|=0x01;    	 
			
TIM1->CC_R1 =255;
что нужно дописать для включения ШИМ? чтобы он работал

Assembler
() автор топика
Ответ на: комментарий от Assembler

PWM mode

Pulse Width Modulation mode allows generating a signal with a frequency determined by the value of the TIMx_ARR register and a duty cycle determined by the value of the TIMx_CCRx register.

The PWM mode can be selected independently on each channel (one PWM per OCx output) by writing 110 (PWM mode 1) or 111 (PWM mode 2) in the OCxM bits in the TIMx_CCMRx register. The corresponding preload register must be enabled by setting the OCxPE bit in the TIMx_CCMRx register, and eventually the auto-reload preload register (in upcounting or center-aligned modes) by setting the ARPE bit in the TIMx_CR1 register.

As the preload registers are transferred to the shadow registers only when an update event occurs, before starting the counter, the user must initialize all the registers by setting the UG bit in the TIMx_EGR register.

OCx polarity is software programmable using the CCxP bit in the TIMx_CCER register. It can be programmed as active high or active low. OCx output is enabled by a combination of the CCxE, CCxNE, MOE, OSSI and OSSR bits (TIMx_CCER and TIMx_BDTR registers). Refer to the TIMx_CCER register description for more details.

In PWM mode (1 or 2), TIMx_CNT and TIMx_CCRx are always compared to determine whether TIMx_CCRx≤TIMx_CNT or TIMx_CNT≤TIMx_CCRx (depending on the direction of the counter).

anonymous
()
Ответ на: комментарий от anonymous

ну я настроил режим ШИМ1. включил TIM1_CR1_ARPE xчто еще надо вкл?


.syntax unified
.cpu cortex-m3
.thumb

RCC_APB2ENR = 0x40021018

RCC_APB2ENR_I = (1 << 2)
RCC_APB2ENR_T = (1 << 11)



GPIOA_CRH = 0x40010804
TIM1_CR1 = 0x40012c00
TIM_CR1_URS = (1 << 2)
TIM_CR1_CEN = (1 << 0)

TIM1_PSC = 0x40012c28
TIM1_ARR = 0x40012c2c

TIM1_DIER = 0x40012c0c
TIM_DIER_UIE = (1 << 0)

TIM1_EGR = 0x40012c14
TIM_EGR_UG = (1 << 0)

NVIC_ISER0 = 0xe000e100
TIM1_UP = (1 << 25)

TIM1_SR = 0x40012c10
TIM_SR_UIF = (1 << 0)


GPIOA_ODR = 0x4001080C

.text
	.word   0x20005000
	.word   _start 
	

.global _start
_start:
	

	ldr    r0, =TIM1_CR1
	ldr    r1, =TIM_CR1_URS
	str    r1, [r0]

	ldr    r0, =TIM1_PSC
	ldr    r1, =10000
	str    r1, [r0]

	ldr    r0, =TIM1_ARR
	ldr    r1, =3000
	str    r1, [r0]

	
	ldr    r0, =TIM1_EGR
	ldr    r1, =TIM_EGR_UG
	str    r1, [r0]

//TIM1 =0x40012C00
//enable PWM
TIM1_CCMR1= 0x40012C18
TIM1_ССER =0x40012C20
TIM1_CR1 =0x40012c00
TIM1_BDTR =0x40012C44
Tim1_CCR1 =0x40012C34


TIM1->CC_MR1|=6<<4;  		 
TIM1->CC_MR1|=1<<3; 		 
TIM1->CC_ER|=1<<0;   		   
TIM1->BDTR|=1<<15;      
			
TIM1->CR1=0x0080;   	
TIM1->CR1|=0x01;    	 
			
TIM1->CC_R1 =255;
//enable TIM1_CR1_ARPE 
ldr r0, =TIM1_CR1
TIM_ARPE = (1 << 7)
ldr r1, =TIM_ARPE
str r1, [r0]

Assembler
() автор топика
Ответ на: комментарий от Eddy_Em

Эдуард, нужен дельный совет по вкл ШИМ. что еще нужно дописать в код чтобы ШИМ работал плавно и видимо глазу? или вольтметру на ноге А8

Assembler
() автор топика
Ответ на: комментарий от Assembler

с шимом, похоже, уже никому не интересно. давай следующую тему про усб на stm32 — вот где веселье-то начнётся!

пс: надо ещё порт включить и настроить ногу на альтернативный выход. ты на каком языке программу пишешь? ничего не понятно. ты, пожалуйста, пиши так, чтобы всем понятно было, а не только тебе. не бери плохой пример с эдиков.

anonymous
()
Ответ на: комментарий от anonymous

давай следующую тему про усб на stm32 — вот где веселье-то начнётся!

Угу. Заготовка hello-world’а и пояснение «что мне дописать чтобы запустить USB на ассемблере»

COKPOWEHEU
()
Ответ на: комментарий от anonymous

на каком языке программу пишешь?

на Assembler)

TIM1_CR1 = 0x40012c00
TIM_CR1 = (1 << 0 )
ldr r0, =0x40012c00
ldr r1, = TIM_CR1
str r1, [r0]
включил. TIM1 счетчик что еще простите я не понял?

альтернативный выход.

это как?

Assembler
() автор топика
Ответ на: комментарий от anonymous

ничего не понятно

я не специально. мне просто надо понять как включить ШИМ чтобы он работал плавно зажигая светодиод.

TIM1->CC_R1 =255
такое значение пойдет?

Assembler
() автор топика
Ответ на: комментарий от COKPOWEHEU

вы поможите или нет?

TIM1_CR1 = 0x40012c00
TIM_CR1 = (1 << 0 )
ldr r0, =0x40012c00
ldr r1, = TIM_CR1
str r1, [r0]
TIM1_CCMR1= 0x40012C18
TIM1_ССER =0x40012C20
TIM1_CR1 =0x40012c00
TIM1_BDTR =0x40012C44
Tim1_CCR1 =0x40012C34


TIM1->CC_MR1|=6<<4;  		 
TIM1->CC_MR1|=1<<3; 		 
TIM1->CC_ER|=1<<0;   		   
TIM1->BDTR|=1<<15;      
			
TIM1->CR1=0x0080;   	
TIM1->CR1|=0x01;    	 
			
TIM1->CC_R1 =255;
//enable TIM1_CR1_ARPE 
ldr r0, =TIM1_CR1
TIM_ARPE = (1 << 7)
ldr r1, =TIM_ARPE
str r1, [r0]
тут практически все понятно и для СИ программистов. что нужно подправить чтобы ШИМ плавно зажигал светодиод и гасил?

Assembler
() автор топика
Ответ на: комментарий от Assembler

альтернативный выход.

это как?

Port configuration register high (GPIOx_CRH)

CNFy[1:0]: Port x configuration bits (y= 8 .. 15)
...
In output mode (MODE[1:0] > 00):
...
10: Alternate function output Push-pull
11: Alternate function output Open-drain
anonymous
()
Ответ на: комментарий от Assembler

Эдуард, нужен дельный совет

Эдуард ушел на работу. Он астроном, а они работают по ночам.

Владимир

anonymous
()
Ответ на: комментарий от anonymous

он же слесарем астрономического оборудования работает

anonymous
()
Ответ на: комментарий от anonymous
00: General purpose output push-pull

нет. только так работает. за помощь вам спасибо огромное

Assembler
() автор топика
Ответ на: комментарий от Assembler

Ну возьми же ты у меня в примерах на гитхабе код! Там чуть ли не в каждой второй железяке управление ШИМом идет.

Да и вообще, тебе ж подсказали в сниппетах от ST посмотреть. Они хоть и для STM32F0, но на F103 очень многое переносится прямо сразу же!

Вот, например: раз, два. А здесь (как раз под F103, кстати) у меня для управления ШИМом используется DMA ­— то, что ты хотел для плавности. Я, кстати, таймер в режиме ШИМ использую и для работы 1-wire, можешь соответствующий код посмотреть.

В принципе, все там делается достаточно просто на основе RM и примеров из сниппетов. Вот только я не представляю, вот что в твоем случае несложные манипуляции на С выльются в ассемблере! Скажем, тот же массив байт на 256 гонять…

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Assembler

чтобы ШИМ плавно зажигал светодиод и гасил?

Для этого понадобится второй таймер, который будет пинать DMA, которое будет менять TIMx->CCRy. Либо даже это может быть тот же самый таймер — почему бы ему по событию CCy не пнуть DMA? Только в данном случае регистр CCRy должен быть буферизуемым, иначе будут косяки.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

в примерах на гитхабе код

еще много чего не догоняю, и ваш код очень пока что сложен для меня. Я зажег и так без DMA, на TIM1. ШИМ вроде работает. Вольтметр показывает вовышение и понижаение напряжения. вроде все без скачков. сегодня подпояю светодиод и уже узнаю точно.

тебе ж подсказали в сниппетах от ST посмотреть

да блин, я еще практически ничего не понимаю. подсказка поможет тому кто уже разбирается. А мне могут помочь только объяснения или примеры. кстати за примеры Эдуард спасибо.

Assembler
() автор топика
Ответ на: комментарий от Eddy_Em

я не представляю

Развивай воображение.

@ void copy_data(uint8_t *from, uint8_t *to, int32_t n);
1:
    ldrb r3, [r0], #1
    strb r3, [r1], #1
copy_data:
    subs r2, #1
    bpl 1b
  bx lr

А можно ли на Си в 5 инструкций уложиться?

anonymous
()
Ответ на: комментарий от Assembler

Без DMA ты не сможешь обеспечить плавность, не напрягая вычислительное ядро МК. В этом случае тебе придется в прерывании изменять значение CCR, а это чревато накладными расходами.

С DMA все достаточно просто и почти не накладно (понятно, что все равно будет использоваться доступ к памяти, но зато уже не нужно будет всякие лишние операции проводить по переходу в функцию обработчика прерываний). С другой стороны, если тебе нужно просто пилу генерировать, то, возможно, хватит и прерывания: буферизуй CCR, а в прерывании по этому событию инкрементируй или декрементируй содержимое этого регистра до определенного значения.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Без DMA ты не сможешь обеспечить плавность, не напрягая вычислительное ядро МК.

Пока что плевать на загруженность ядра, все равно оно ничего другого не делает. Если ТС хочет учиться, пусть учится последовательно. Скажем, сначала программный ШИМ на тупых задержках, потом на прерывании таймера, на аппаратном таймере.

И с алгоритмами тоже самое: сначала пусть будет говнокод в бесконечном цикле main(), потом можно выносить в функции или прерывания, потом осваивать конечные автоматы, а там и до операционных систем недалеко. Причем в плане операционных систем ТСу будет несколько проще, чем если бы он начинал с Си: стек так пугать не будет.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

программный ШИМ на тупых задержках, потом на прерывании таймера, на аппаратном таймере.

вот тут очень важно. сейчас я от таймера путем прямого счета при наступлении события с помощью GPIOx_ODR я управляю GPIO. но если я захочу чтобы это делал котроллер то понадобится альтернативная функция(AFIO)? но сейчас я без AFIO обхожусь. но ШИМ-это контроллер. как тогда? что я не понял?

Assembler
() автор топика
Ответ на: комментарий от Assembler

Пока что плевать на загруженность ядра, все равно оно ничего другого не делает. Если ТС хочет учиться, пусть учится последовательно. Скажем, сначала программный ШИМ на тупых задержках, потом на прерывании таймера, на аппаратном таймере.

И с алгоритмами тоже самое: сначала пусть будет говнокод в бесконечном цикле main(), потом можно выносить в функции или прерывания, потом осваивать конечные автоматы, а там и до операционных систем недалеко. Причем в плане операционных систем ТСу будет несколько проще, чем если бы он начинал с Си: стек так пугать не будет.

@Assembler распечатай этот пост и на стенку перед монитором повесь.
В нем все правильно сказано …

anonymous
()
Ответ на: комментарий от Assembler

Простейший программный ШИМ можно на systick сделать: настраиваешь systick на период в 1мс, в прерывании инкрементируешь некий счетчик, а в суперлупе проверяешь значение счетчика, скажем, как-то так:

static volatile uint32_t blink_ctr = 0;

void sys_tick_handler(void){
  ++blink_ctr;
}

void main(){
  uint32_t loc_ctr = 0;
  uint32_t TLow = 1, TTot = 100, inc = 1;
  uint8_t Pnow = 0;
...
  while(1){
    if(Pnow){
      if(blink_ctr - loc_ctr >= TTot-TLow){
        Pnow = 0; clear(LED);
        loc_ctr = blink_ctr;
      }
    }else{
      if(blink_ctr - loc_ctr >= TLow){
        Pnow = 1; set(LED);
        loc_ctr = blink_ctr;
        TLow += inc;
        if(TLow < 1 || TLow > TTot - 1) inc = -inc;
      }
  }
...
}

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

хоть я и не понял, что вы хотели сказать, но спасибо. я про альтернативные функции спрашивал. мне тут посоветовали включить AFIO и я подумал что

вот тут очень важно. сейчас я от таймера путем прямого счета при наступлении события с помощью GPIOx_ODR я управляю GPIO. но если я захочу чтобы это делал котроллер то понадобится альтернативная функция(AFIO)? но сейчас я без AFIO обхожусь. но ШИМ-это контроллер. как тогда? что я не понял?
Assembler
() автор топика
Ответ на: комментарий от Assembler

Если ты настраиваешь ногу МК как аппаратный выход ШИМ (а для начала посмотри по даташиту, на какие ноги какие таймеры имеют счетные выходы), то включаешь данную ногу как AFIO в нужном режиме (pushpull out/opendrain out/in), настраиваешь при необходимости ремап, конфигурируешь таймер и запускаешь — все, у тебя на ноге появляется аппаратный ШИМ. Вот - простейший пример (ШИМ на ноге PA8 F103, TIM1->CC1). Вот так настраивается нога:

GPIOA->CRH |= CRH(8, CNF_AFPP | MODE_FAST);
(альтернативная функция push-pull out).

Эта функция меняет частоту ШИМ (при этом заполнение остается примерно тем же, что и было). Эта функция меняет заполнение (в промилле).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Простейший программный ШИМ можно на systick сделать: настраиваешь systick на период в 1мс

1мс это слишком медленно. Даже при 8-битной разрядности получится частота в 4 Гц, это откровенное мерцание. Частота ШИМ должна быть хотя бы 100-1000 Гц, то есть для 8-битного счета частота прерываний должна быть 25,6 - 256 кГц. Если речь о systick, то можно настроить на 50 или 100 кГц. Но лучше все же не смешивать глобальный счет времени с ШИМ и взять обычный таймер.

COKPOWEHEU
()
Ответ на: комментарий от Assembler

понадобится альтернативная функция(AFIO)

Попробуйте для начала внятно описать как вы поняли что такое AFIO, для чего оно нужно и как настраивается. Ну то есть зачем его вообще придумали.

COKPOWEHEU
()
Ответ на: комментарий от Eddy_Em

то включаешь данную ногу как AFIO

почему? у меня сейчас функция настроена на

00: General purpose output push-pull
и работает ШИМ. поэтому я и спрашиваю. так то да, если принять во внимание, что альтернативные функции нужны для работы с переферией, только вот не знаю контроллер ШИМ рассамтривается наверное как внутренняя переферия, и тогда для работы с ним нужны
10: Alternate function output Push-pull AFIO.
но у меня работает
00: General purpose output push-pull
видимо что-то пропустил.

Assembler
() автор топика
Последнее исправление: Assembler (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

Эдуард, я не понимаю СИ. поэтому для меня примеры на нем бесполезны, даже если они очень простые. Поэтому нет смысла их писать. да тут и при разборе AFIO они и не нужны. я просто не понимаю, почему то что описал выше. Работает без AFIO, хотя без АFIO работать не должно. вопрос только в этом.

Assembler
() автор топика
Ответ на: комментарий от Assembler

и как-то странно. просишь примеры Assembler, никто не пишет. тогда просишь объяснить на пальцах, люди пишут сразу примеры а СИ) хотя между Assembler и СИ мало общего, я бы даже сказал, что ничего

Assembler
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.