STM32F0 LL库 笔记 (定期更新)


延迟
LL_mDelay 基于systic的

串口
https://blog.csdn.net/qq_45474612/article/details/100881454
https://www.cnblogs.com/amw2738/p/STM32F0.html
https://blog.csdn.net/weixin_42067548/article/details/105099049
串口DMA
https://blog.csdn.net/songskygo/article/details/89568679

定时
https://blog.csdn.net/lljss1980/article/details/105003608
定时捕获
https://www.eemaker.com/stm32-ll-lib-timer.html

Flash的LL库要自己写
https://blog.csdn.net/qq_45474612/article/details/101222222

YMODEM IAP
https://blog.csdn.net/qq_45474612/article/details/101221981


DHT11
https://blog.csdn.net/qq_45474612/article/details/99065861

static void usDelay(uint8_t x) //毫秒延迟,我开了一个定时器,但是我没有开中断,会有一点误差,但是不会太大
{
LL_TIM_DisableCounter(TIM1);
LL_TIM_SetCounter(TIM1, 0);
LL_TIM_EnableCounter(TIM1);
while (LL_TIM_GetCounter(TIM1) != x)
{
}
}


DMA
https://blog.csdn.net/qq_45474612/article/details/97888448

 

DMA:AD
https://www.cnblogs.com/foxclever/p/10289772.html

这部分做完,直接上代码

#define    ADC_DMA_BUF_CH    5 /* 通道数 */
#define    ADC_DMA_BUF_LEN    8 /* 每个通道缓存数据 */
#define    ADC_DMA_BUF_SIZE    (ADC_DMA_BUF_LEN*ADC_DMA_BUF_CH) /* 总BUF大小 */

static uint16_t tAD[ADC_DMA_BUF_CH];
static uint16_t adcBuf[ADC_DMA_BUF_SIZE];



void adc_dma_init()
{

    // LL_ADC_StartCalibration(ADC1);
    // while( LL_ADC_IsCalibrationOnGoing(ADC1));

    // LL_ADC_Enable(ADC1);
    // LL_ADC_REG_StartConversion(ADC1);
    // LL_mDelay(2);

    LL_DMA_SetDataLength(DMA1,LL_DMA_CHANNEL_1,ADC_DMA_BUF_SIZE);
    LL_DMA_SetPeriphAddress(DMA1,LL_DMA_CHANNEL_1,LL_ADC_DMA_GetRegAddr(ADC1,LL_ADC_DMA_REG_REGULAR_DATA));
    LL_DMA_SetMemoryAddress(DMA1,LL_DMA_CHANNEL_1,(uint32_t)adcBuf);

    //LL_DMA_ConfigAddresses(DMA1,LL_DMA_CHANNEL_1,(uint32_t)&(ADC1->DR),(uint32_t) &adcBuf,LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
    // LL_ADC_REG_SetDMATransfer(ADC1,LL_ADC_REG_DMA_TRANSFER_UNLIMITED);

    uint32_t dma_transfer = LL_ADC_REG_GetDMATransfer(ADC1);
    LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_NONE);

    LL_ADC_StartCalibration(ADC1);

    while (LL_ADC_IsCalibrationOnGoing(ADC1))
    ;
    LL_ADC_REG_SetDMATransfer(ADC1, dma_transfer);

    LL_ADC_Enable(ADC1);
    LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);

    LL_ADC_REG_StartConversion(ADC1);
    //LL_DMA_EnableChannel(DMA1,LL_DMA_CHANNEL_1);

}


uint8_t adc_get( uint16_t *adc_data_buf)
{
    if ( LL_DMA_IsActiveFlag_TC1(DMA1) )
    {
        uint16_t i,j;
        uint16_t * tadBuf;

        tadBuf = & adcBuf[0];

        for(i = 0; i < ADC_DMA_BUF_CH; i++)
        {
            tAD[i] = 0;
        }
      /* 这里对数据做一下平均 */
        for(i = 0; i < ADC_DMA_BUF_CH; i++)
        {
            for(j = 0; j < ADC_DMA_BUF_LEN; j++)
            {
                tAD[i] = tAD[i] + tadBuf[j*ADC_DMA_BUF_CH + i];
            }
            tAD[i] = tAD[i] / ADC_DMA_BUF_LEN;
        }
       // printf("\r\n tAD[0]=%d tAD[1]=%d tAD[2]=%d tAD[3]=%d tAD[4]=%d \r\n",tAD[0],tAD[1],tAD[2],tAD[3],tAD[4]); 
        memcpy(adc_data_buf,tAD,ADC_DMA_BUF_CH*2);  /* 注意memcpy 还是用8位数据 */
        
        return 1;
    }
    return 0;
}

 

 


SPI
https://www.cnblogs.com/foxclever/p/10257447.html 注意自己加 LL_SPI_SetRxFIFOThreshold(SPI1,LL_SPI_RX_FIFO_TH_QUARTER); 8位
标准库:https://blog.csdn.net/qq_24835087/article/details/103803860 注意SPI_RxFIFOThresholdConfig 8位

        
/* 注意启用一下 */

  LL_SPI_SetRxFIFOThreshold(SPI1,LL_SPI_RX_FIFO_TH_QUARTER);
   LL_SPI_Enable( SPI1 ); 

 

/* 读取数据 */

static uint8_t dev_flash_read_write_byte(uint8_t tx_data)
{		
    uint16_t retry=0;
    
	while (LL_SPI_IsActiveFlag_TXE( SPI1 ) == RESET) 
	{
		retry++;
		if(retry>20000)return 0;
	}
	LL_SPI_TransmitData8(SPI1,tx_data);
	retry=0;
	while (LL_SPI_IsActiveFlag_RXNE( SPI1 ) == RESET) 
	{
		retry++;
		if(retry>20000)return 0;
	}
	return (LL_SPI_ReceiveData8(SPI1));
 
}

  

 


可以做将一些时基放在SysTick_Handler里面
https://blog.csdn.net/qq_45474612/article/details/103045491

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM