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